From 394538ebf1cd45240a72e5f0b4ec5136b235eba1 Mon Sep 17 00:00:00 2001 From: Brian Wilkerson Date: Thu, 1 Feb 2024 17:10:36 +0000 Subject: [PATCH] Enhance semantic highlighting for macros Change-Id: I1d2e26e25f69971ea9a7979290d26c8f63208923 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349363 Reviewed-by: Phil Quitslund Reviewed-by: Keerti Parthasarathy Commit-Queue: Brian Wilkerson --- .../lib/src/computer/computer_highlights.dart | 46 +++++ .../notification_highlights2_test.dart | 173 ++++++++++++++++-- 2 files changed, 199 insertions(+), 20 deletions(-) diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart index 5b40753f5477..c444ed83fcc9 100644 --- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart +++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart @@ -637,6 +637,15 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { super.visitAssignedVariablePattern(node); } + @override + void visitAugmentationImportDirective(AugmentationImportDirective node) { + computer._addRegion_node(node, HighlightRegionType.DIRECTIVE); + computer._addRegion_token(node.importKeyword, HighlightRegionType.BUILT_IN); + computer._addRegion_token( + node.augmentKeyword, HighlightRegionType.BUILT_IN); + super.visitAugmentationImportDirective(node); + } + @override void visitAwaitExpression(AwaitExpression node) { computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN, @@ -719,6 +728,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitClassTypeAlias(ClassTypeAlias node) { + // TODO(brianwilkerson): Update the interface to expose the token. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.abstractKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token(node.sealedKeyword, HighlightRegionType.BUILT_IN); @@ -738,6 +750,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitConstructorDeclaration(ConstructorDeclaration node) { + computer._addRegion_token( + node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.externalKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( @@ -836,6 +850,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitEnumDeclaration(EnumDeclaration node) { + // TODO(brianwilkerson): Uncomment the following lines when the token is + // supported. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token(node.enumKeyword, HighlightRegionType.KEYWORD); computer._addRegion_token(node.name, HighlightRegionType.ENUM); super.visitEnumDeclaration(node); @@ -863,6 +881,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitExtensionDeclaration(ExtensionDeclaration node) { + // TODO(brianwilkerson): Uncomment the following lines when the token is + // supported. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.extensionKeyword, HighlightRegionType.KEYWORD); computer._addRegion_token(node.name, HighlightRegionType.EXTENSION); @@ -908,6 +930,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitFieldDeclaration(FieldDeclaration node) { + // TODO(brianwilkerson): Update the interface to expose the token. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.abstractKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( @@ -983,6 +1008,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitFunctionDeclaration(FunctionDeclaration node) { + // TODO(brianwilkerson): Update the interface to expose the token. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.externalKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( @@ -1145,6 +1173,16 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { super.visitIsExpression(node); } + @override + void visitLibraryAugmentationDirective(LibraryAugmentationDirective node) { + computer._addRegion_node(node, HighlightRegionType.DIRECTIVE); + computer._addRegion_token( + node.libraryKeyword, HighlightRegionType.BUILT_IN); + computer._addRegion_token( + node.augmentKeyword, HighlightRegionType.BUILT_IN); + super.visitLibraryAugmentationDirective(node); + } + @override void visitLibraryDirective(LibraryDirective node) { computer._addRegion_node(node, HighlightRegionType.DIRECTIVE); @@ -1168,6 +1206,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitMethodDeclaration(MethodDeclaration node) { + computer._addRegion_token( + node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.externalKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( @@ -1198,6 +1238,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitMixinDeclaration(MixinDeclaration node) { + computer._addRegion_token( + node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token(node.baseKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token(node.name, HighlightRegionType.MIXIN); @@ -1494,6 +1536,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor { @override void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { + // TODO(brianwilkerson): Uncomment the following lines when the token is + // supported. + // computer._addRegion_token( + // node.augmentKeyword, HighlightRegionType.BUILT_IN); computer._addRegion_token( node.externalKeyword, HighlightRegionType.BUILT_IN); diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart index a182ce9373d7..1c2a3d603ced 100644 --- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart +++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:analysis_server/protocol/protocol.dart'; import 'package:analysis_server/protocol/protocol_constants.dart'; import 'package:analysis_server/protocol/protocol_generated.dart'; -import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/source/source_range.dart'; import 'package:analyzer/src/test_utilities/test_code_format.dart'; import 'package:analyzer_plugin/protocol/protocol_common.dart'; @@ -26,12 +25,6 @@ void main() { @reflectiveTest class AnalysisNotificationHighlightsTest extends HighlightsTestSupport { - @override - List get experiments => [ - Feature.inline_class.enableString, - ...super.experiments, - ]; - void assertHighlightText(TestCode testCode, int index, String expected) { var actual = _getHighlightText(testCode, index); if (actual != expected) { @@ -118,6 +111,159 @@ void f() { assertNoRegion(HighlightRegionType.BUILT_IN, 'async = false'); } + Future test_BUILT_IN_augment_onClass() async { + final testCode = TestCode.parse(r''' +augment class A {} +'''); + addTestFile(testCode.code); + await prepareHighlights(); + assertHighlightText(testCode, -1, r''' +0 + 7 |augment| BUILT_IN +8 + 5 |class| KEYWORD +14 + 1 |A| CLASS +'''); + } + + Future test_BUILT_IN_augment_onConstructor() async { + addTestFile(''' +class C { + augment C() {} +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onEnum() async { + addTestFile(''' +augment enum E {a, b} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onExtention() async { + addTestFile(''' +augment extension on int {} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onImport() async { + addTestFile(''' +import augment 'a.dart'; +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'import'); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onInstanceGetter() async { + addTestFile(''' +class C { + augment int get g => 0; +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onInstanceMethod() async { + addTestFile(''' +class C { + augment int m() => 0; +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onInstanceSetter() async { + addTestFile(''' +class C { + augment set s(int x) {} +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onLibrary() async { + addTestFile(''' +library augment 'a.dart'; +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'library'); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onMixin() async { + addTestFile(''' +augment mixin M {} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onOperator() async { + addTestFile(''' +class C { + augment int operator -() => 0; +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + Future test_BUILT_IN_augment_onStaticMethod() async { + addTestFile(''' +class C { + augment static int m() => 0; +} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onTopLevelFunction() async { + addTestFile(''' +augment int f(int x) => 0; +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onTopLevelGetter() async { + addTestFile(''' +augment int get g => 0; +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onTopLevelSetter() async { + addTestFile(''' +augment set s(int x) {} +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + + @FailingTest(reason: 'The token is not supported') + Future test_BUILT_IN_augment_onTopLevelVariable() async { + addTestFile(''' +augment int v = 0; +'''); + await prepareHighlights(); + assertHasRegion(HighlightRegionType.BUILT_IN, 'augment'); + } + Future test_BUILT_IN_await() async { addTestFile(''' void f() async { @@ -569,19 +715,6 @@ Never nnn() => throw ''; assertHasRegion(HighlightRegionType.CLASS, 'Never nnn'); } - Future test_class_augmentKeyword() async { - final testCode = TestCode.parse(r''' -augment class A {} -'''); - addTestFile(testCode.code); - await prepareHighlights(); - assertHighlightText(testCode, -1, r''' -0 + 7 |augment| BUILT_IN -8 + 5 |class| KEYWORD -14 + 1 |A| CLASS -'''); - } - Future test_class_constructor_fieldFormalParameter() async { var testCode = TestCode.parse(r''' class A {