@@ -104,15 +104,32 @@ pub fn request_id_as_str(id: RequestId) -> Option<String> {
104104 . map ( ToString :: to_string)
105105}
106106
107+ /// Returns true if the LSP client advertises capabilities needed to create new projects via workspace edit, or false otherwise.
108+ pub fn can_create_project_via_workspace_edit ( client_capabilities : & ClientCapabilities ) -> bool {
109+ client_capabilities. workspace . as_ref ( ) . map_or ( false , |it| {
110+ // Checks support for workspace/applyEdit requests.
111+ it. apply_edit . unwrap_or ( false )
112+ && it. workspace_edit . as_ref ( ) . map_or ( false , |it| {
113+ // Checks support for versioned document changes.
114+ it. document_changes . unwrap_or ( false )
115+ // Checks support for create file operation.
116+ && it. resource_operations . as_ref ( ) . map_or ( false , |it| {
117+ it. contains ( & lsp_types:: ResourceOperationKind :: Create )
118+ } )
119+ } )
120+ } )
121+ }
122+
107123#[ cfg( test) ]
108124mod tests {
109125 use super :: * ;
110126 use crate :: utils:: { code_actions_kinds, position_encoding, SERVER_CODE_ACTION_KINDS } ;
111127 use lsp_types:: {
112128 CodeActionClientCapabilities , CodeActionKindLiteralSupport , CodeActionLiteralSupport ,
113129 CompletionClientCapabilities , CompletionItemCapability , GeneralClientCapabilities ,
114- ParameterInformationSettings , SignatureHelpClientCapabilities ,
115- SignatureInformationSettings , TextDocumentClientCapabilities ,
130+ ParameterInformationSettings , ResourceOperationKind , SignatureHelpClientCapabilities ,
131+ SignatureInformationSettings , TextDocumentClientCapabilities , WorkspaceClientCapabilities ,
132+ WorkspaceEditClientCapabilities ,
116133 } ;
117134
118135 fn config_with_encodings ( encodings : Option < Vec < PositionEncodingKind > > ) -> ClientCapabilities {
@@ -183,6 +200,25 @@ mod tests {
183200 }
184201 }
185202
203+ fn config_with_workspace_edit_capabilities (
204+ apply_edit : Option < bool > ,
205+ document_changes : Option < bool > ,
206+ resource_operations : Option < Vec < ResourceOperationKind > > ,
207+ ) -> ClientCapabilities {
208+ ClientCapabilities {
209+ workspace : Some ( WorkspaceClientCapabilities {
210+ apply_edit,
211+ workspace_edit : Some ( WorkspaceEditClientCapabilities {
212+ document_changes,
213+ resource_operations,
214+ ..Default :: default ( )
215+ } ) ,
216+ ..Default :: default ( )
217+ } ) ,
218+ ..Default :: default ( )
219+ }
220+ }
221+
186222 #[ test]
187223 fn position_encoding_works ( ) {
188224 for ( client_capabilities, expected_encoding) in [
@@ -366,4 +402,61 @@ mod tests {
366402 assert_eq ! ( signature_support( & client_capabilities) , expected_result) ;
367403 }
368404 }
405+
406+ #[ test]
407+ fn can_create_project_via_workspace_edit_works ( ) {
408+ for ( client_capabilities, expected_result) in [
409+ // Default is `false`.
410+ ( ClientCapabilities :: default ( ) , false ) ,
411+ // None is `false`.
412+ (
413+ config_with_workspace_edit_capabilities ( None , None , None ) ,
414+ false ,
415+ ) ,
416+ // Partial support for some conditions fails.
417+ (
418+ config_with_workspace_edit_capabilities ( Some ( true ) , None , None ) ,
419+ false ,
420+ ) ,
421+ (
422+ config_with_workspace_edit_capabilities ( None , Some ( true ) , None ) ,
423+ false ,
424+ ) ,
425+ (
426+ config_with_workspace_edit_capabilities (
427+ None ,
428+ None ,
429+ Some ( vec ! [ ResourceOperationKind :: Create ] ) ,
430+ ) ,
431+ false ,
432+ ) ,
433+ (
434+ config_with_workspace_edit_capabilities (
435+ Some ( true ) ,
436+ Some ( true ) ,
437+ // Missing create operation.
438+ Some ( vec ! [
439+ ResourceOperationKind :: Delete ,
440+ ResourceOperationKind :: Rename ,
441+ ] ) ,
442+ ) ,
443+ false ,
444+ ) ,
445+ // Full support for all conditions works.
446+ (
447+ config_with_workspace_edit_capabilities (
448+ Some ( true ) ,
449+ Some ( true ) ,
450+ Some ( vec ! [ ResourceOperationKind :: Create ] ) ,
451+ ) ,
452+ true ,
453+ ) ,
454+ ] {
455+ // Verifies the expected result based on client capabilities.
456+ assert_eq ! (
457+ can_create_project_via_workspace_edit( & client_capabilities) ,
458+ expected_result
459+ ) ;
460+ }
461+ }
369462}
0 commit comments