Skip to content

Commit 2b7b4dc

Browse files
incendialCommit Queue
authored and
Commit Queue
committed
[analysis_server] Fix CodeAction LSP dynamic registration config
Bug: #50531 Change-Id: I35a3c05a70a4ffe9ae0bbfb13874eddfaa302b25 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/272260 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent a3befd3 commit 2b7b4dc

File tree

3 files changed

+139
-17
lines changed

3 files changed

+139
-17
lines changed

pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class ClientDynamicRegistrations {
5757
_capabilities.textDocument?.callHierarchy?.dynamicRegistration ?? false;
5858

5959
bool get codeActions =>
60-
_capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
60+
_capabilities.textDocument?.codeAction?.dynamicRegistration ?? false;
6161

6262
bool get colorProvider =>
6363
_capabilities.textDocument?.colorProvider?.dynamicRegistration ?? false;

pkg/analysis_server/test/lsp/initialization_test.dart

Lines changed: 112 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,27 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
3535
await pumpEventQueue(times: 5000);
3636
}
3737

38+
Future<void> assertDynamicRegistration(
39+
String name, Set<Method> expectedResult) async {
40+
// Check that when the server calls client/registerCapability it only includes
41+
// the items we advertised dynamic registration support for.
42+
final registrations = <Registration>[];
43+
await monitorDynamicRegistrations(
44+
registrations,
45+
() => initialize(
46+
textDocumentCapabilities: withGivenTextDocumentDynamicRegistrations(
47+
emptyTextDocumentClientCapabilities, name),
48+
workspaceCapabilities: withGivenWorkspaceDynamicRegistrations(
49+
emptyWorkspaceClientCapabilities, name)),
50+
);
51+
52+
final registeredMethods =
53+
registrations.map((registration) => registration.method).toSet();
54+
final result = expectedResult.map((method) => method.toJson()).toSet();
55+
56+
expect(registeredMethods, equals(result));
57+
}
58+
3859
TextDocumentRegistrationOptions registrationOptionsFor(
3960
List<Registration> registrations,
4061
Method method,
@@ -243,6 +264,97 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
243264
await Future.wait([registrationsDone, unregistrationsDone]);
244265
}
245266

267+
Future<void> test_dynamicRegistration_config_allHierarchy() =>
268+
assertDynamicRegistration(
269+
'callHierarchy', {Method.textDocument_prepareCallHierarchy});
270+
271+
Future<void> test_dynamicRegistration_config_codeAction() =>
272+
assertDynamicRegistration('codeAction', {Method.textDocument_codeAction});
273+
274+
Future<void> test_dynamicRegistration_config_colorProvider() =>
275+
assertDynamicRegistration(
276+
'colorProvider', {Method.textDocument_documentColor});
277+
278+
Future<void> test_dynamicRegistration_config_completion() =>
279+
assertDynamicRegistration('completion', {Method.textDocument_completion});
280+
281+
Future<void> test_dynamicRegistration_config_definition() =>
282+
assertDynamicRegistration('definition', {Method.textDocument_definition});
283+
284+
Future<void> test_dynamicRegistration_config_didChangeConfiguration() =>
285+
assertDynamicRegistration(
286+
'didChangeConfiguration', {Method.workspace_didChangeConfiguration});
287+
288+
Future<void> test_dynamicRegistration_config_documentHighlight() =>
289+
assertDynamicRegistration(
290+
'documentHighlight', {Method.textDocument_documentHighlight});
291+
292+
Future<void> test_dynamicRegistration_config_documentSymbol() =>
293+
assertDynamicRegistration(
294+
'documentSymbol', {Method.textDocument_documentSymbol});
295+
296+
Future<void> test_dynamicRegistration_config_fileOperations() =>
297+
assertDynamicRegistration(
298+
'fileOperations', {Method.workspace_willRenameFiles});
299+
300+
Future<void> test_dynamicRegistration_config_foldingRange() =>
301+
assertDynamicRegistration(
302+
'foldingRange', {Method.textDocument_foldingRange});
303+
304+
Future<void> test_dynamicRegistration_config_formatting() =>
305+
assertDynamicRegistration('formatting', {Method.textDocument_formatting});
306+
307+
Future<void> test_dynamicRegistration_config_hover() =>
308+
assertDynamicRegistration('hover', {Method.textDocument_hover});
309+
310+
Future<void> test_dynamicRegistration_config_implementation() =>
311+
assertDynamicRegistration(
312+
'implementation', {Method.textDocument_implementation});
313+
314+
Future<void> test_dynamicRegistration_config_inlayHint() =>
315+
assertDynamicRegistration('inlayHint', {Method.textDocument_inlayHint});
316+
317+
Future<void> test_dynamicRegistration_config_onTypeFormatting() =>
318+
assertDynamicRegistration(
319+
'onTypeFormatting', {Method.textDocument_onTypeFormatting});
320+
321+
Future<void> test_dynamicRegistration_config_rangeFormatting() =>
322+
assertDynamicRegistration(
323+
'rangeFormatting', {Method.textDocument_rangeFormatting});
324+
325+
Future<void> test_dynamicRegistration_config_references() =>
326+
assertDynamicRegistration('references', {Method.textDocument_references});
327+
328+
Future<void> test_dynamicRegistration_config_rename() =>
329+
assertDynamicRegistration('rename', {Method.textDocument_rename});
330+
331+
Future<void> test_dynamicRegistration_config_selectionRange() =>
332+
assertDynamicRegistration(
333+
'selectionRange', {Method.textDocument_selectionRange});
334+
335+
Future<void> test_dynamicRegistration_config_semanticTokens() =>
336+
assertDynamicRegistration(
337+
'semanticTokens', {CustomMethods.semanticTokenDynamicRegistration});
338+
339+
Future<void> test_dynamicRegistration_config_signatureHelp() =>
340+
assertDynamicRegistration(
341+
'signatureHelp', {Method.textDocument_signatureHelp});
342+
343+
Future<void> test_dynamicRegistration_config_synchronization() =>
344+
assertDynamicRegistration('synchronization', {
345+
Method.textDocument_didOpen,
346+
Method.textDocument_didChange,
347+
Method.textDocument_didClose
348+
});
349+
350+
Future<void> test_dynamicRegistration_config_typeDefinition() =>
351+
assertDynamicRegistration(
352+
'typeDefinition', {Method.textDocument_typeDefinition});
353+
354+
Future<void> test_dynamicRegistration_config_typeHierarchy() =>
355+
assertDynamicRegistration(
356+
'typeHierarchy', {Method.textDocument_prepareTypeHierarchy});
357+
246358
Future<void> test_dynamicRegistration_containsAppropriateSettings() async {
247359
// Basic check that the server responds with the capabilities we'd expect,
248360
// for ex including analysis_options.yaml in text synchronization but not
@@ -355,22 +467,6 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
355467
expect(didGetRegisterCapabilityRequest, isFalse);
356468
}
357469

358-
Future<void> test_dynamicRegistration_onlyForClientSupportedMethods() async {
359-
// Check that when the server calls client/registerCapability it only includes
360-
// the items we advertised dynamic registration support for.
361-
final registrations = <Registration>[];
362-
await monitorDynamicRegistrations(
363-
registrations,
364-
() => initialize(
365-
textDocumentCapabilities: withHoverDynamicRegistration(
366-
emptyTextDocumentClientCapabilities)),
367-
);
368-
369-
expect(registrations, hasLength(1));
370-
expect(registrations.single.method,
371-
equals(Method.textDocument_hover.toJson()));
372-
}
373-
374470
Future<void> test_dynamicRegistration_suppressesStaticRegistration() async {
375471
// If the client sends dynamicRegistration settings then there
376472
// should not be static registrations for the same capabilities.

pkg/analysis_server/test/lsp/server_abstract.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,32 @@ mixin ClientCapabilitiesHelperMixin {
515515
});
516516
}
517517

518+
TextDocumentClientCapabilities withGivenTextDocumentDynamicRegistrations(
519+
TextDocumentClientCapabilities source,
520+
String name,
521+
) {
522+
final json = name == 'semanticTokens'
523+
? SemanticTokensClientCapabilities(
524+
dynamicRegistration: true,
525+
requests: SemanticTokensClientCapabilitiesRequests(),
526+
formats: [],
527+
tokenModifiers: [],
528+
tokenTypes: []).toJson()
529+
: {'dynamicRegistration': true};
530+
return extendTextDocumentCapabilities(source, {
531+
name: json,
532+
});
533+
}
534+
535+
WorkspaceClientCapabilities withGivenWorkspaceDynamicRegistrations(
536+
WorkspaceClientCapabilities source,
537+
String name,
538+
) {
539+
return extendWorkspaceCapabilities(source, {
540+
name: {'dynamicRegistration': true},
541+
});
542+
}
543+
518544
TextDocumentClientCapabilities withHierarchicalDocumentSymbolSupport(
519545
TextDocumentClientCapabilities source,
520546
) {

0 commit comments

Comments
 (0)