@@ -104,15 +104,32 @@ pub fn request_id_as_str(id: RequestId) -> Option<String> {
104
104
. map ( ToString :: to_string)
105
105
}
106
106
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
+
107
123
#[ cfg( test) ]
108
124
mod tests {
109
125
use super :: * ;
110
126
use crate :: utils:: { code_actions_kinds, position_encoding, SERVER_CODE_ACTION_KINDS } ;
111
127
use lsp_types:: {
112
128
CodeActionClientCapabilities , CodeActionKindLiteralSupport , CodeActionLiteralSupport ,
113
129
CompletionClientCapabilities , CompletionItemCapability , GeneralClientCapabilities ,
114
- ParameterInformationSettings , SignatureHelpClientCapabilities ,
115
- SignatureInformationSettings , TextDocumentClientCapabilities ,
130
+ ParameterInformationSettings , ResourceOperationKind , SignatureHelpClientCapabilities ,
131
+ SignatureInformationSettings , TextDocumentClientCapabilities , WorkspaceClientCapabilities ,
132
+ WorkspaceEditClientCapabilities ,
116
133
} ;
117
134
118
135
fn config_with_encodings ( encodings : Option < Vec < PositionEncodingKind > > ) -> ClientCapabilities {
@@ -183,6 +200,25 @@ mod tests {
183
200
}
184
201
}
185
202
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
+
186
222
#[ test]
187
223
fn position_encoding_works ( ) {
188
224
for ( client_capabilities, expected_encoding) in [
@@ -366,4 +402,61 @@ mod tests {
366
402
assert_eq ! ( signature_support( & client_capabilities) , expected_result) ;
367
403
}
368
404
}
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
+ }
369
462
}
0 commit comments