From a78fb5e47a95e251fd8f6dec034fb01e71e87bf0 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Fri, 7 Feb 2025 12:24:25 -0800 Subject: [PATCH] [analysis_server] Fix semantic tokens for method tear-offs in object patterns Fixes https://github.com/dart-lang/sdk/issues/59976 Change-Id: I75127a59670522ddfc6526d10bfe9844638fdd99 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408001 Reviewed-by: Phil Quitslund Commit-Queue: Phil Quitslund Reviewed-by: Brian Wilkerson --- .../lib/src/computer/computer_highlights.dart | 18 +++++++++++------- .../test/lsp/semantic_tokens_test.dart | 13 ++++++++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart index 9ad93fa832c..751b73f9de4 100644 --- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart +++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart @@ -1497,15 +1497,19 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { } @override - void visitPatternFieldName(PatternFieldName node) { - var name = node.name; + void visitPatternField(PatternField node) { + var name = node.name?.name; if (name != null) { - computer._addRegion_token( - node.name, - HighlightRegionType.INSTANCE_GETTER_REFERENCE, - ); + // Patterns can be method tear-offs as well as getters: + // https://github.com/dart-lang/sdk/issues/59976#issuecomment-2613558317 + var type = switch (node.element2) { + MethodElement2() => HighlightRegionType.INSTANCE_METHOD_TEAR_OFF, + _ => HighlightRegionType.INSTANCE_GETTER_REFERENCE, + }; + + computer._addRegion_token(name, type); } - super.visitPatternFieldName(node); + super.visitPatternField(node); } @override diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart index c44af7ffc42..60c3d2256a0 100644 --- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart +++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart @@ -1726,7 +1726,9 @@ void f() { var content = r''' void f() { switch (1) { - case int(isEven: var isEven) when isEven: + case int(isEven: var isEven, toString: var toString) when isEven: + isEven; + toString; } } '''; @@ -1754,10 +1756,19 @@ void f() { _Token('isEven', SemanticTokenTypes.variable, [ SemanticTokenModifiers.declaration, ]), + _Token('toString', SemanticTokenTypes.method, [ + CustomSemanticTokenModifiers.instance, + ]), + _Token('var', SemanticTokenTypes.keyword), + _Token('toString', SemanticTokenTypes.variable, [ + SemanticTokenModifiers.declaration, + ]), _Token('when', SemanticTokenTypes.keyword, [ CustomSemanticTokenModifiers.control, ]), _Token('isEven', SemanticTokenTypes.variable), + _Token('isEven', SemanticTokenTypes.variable), + _Token('toString', SemanticTokenTypes.variable), ]; await _initializeAndVerifyTokens(content, expected);