Skip to content

Commit

Permalink
Enhance semantic highlighting for macros
Browse files Browse the repository at this point in the history
Change-Id: I1d2e26e25f69971ea9a7979290d26c8f63208923
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349363
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
  • Loading branch information
bwilkerson authored and Commit Queue committed Feb 1, 2024
1 parent 796d027 commit 394538e
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 20 deletions.
46 changes: 46 additions & 0 deletions pkg/analysis_server/lib/src/computer/computer_highlights.dart
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,15 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
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,
Expand Down Expand Up @@ -719,6 +728,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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);
Expand All @@ -738,6 +750,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
computer._addRegion_token(
node.augmentKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
node.externalKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
Expand Down Expand Up @@ -836,6 +850,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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);
Expand Down Expand Up @@ -863,6 +881,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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);
Expand Down Expand Up @@ -908,6 +930,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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(
Expand Down Expand Up @@ -983,6 +1008,9 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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(
Expand Down Expand Up @@ -1145,6 +1173,16 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
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);
Expand All @@ -1168,6 +1206,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@override
void visitMethodDeclaration(MethodDeclaration node) {
computer._addRegion_token(
node.augmentKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
node.externalKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
Expand Down Expand Up @@ -1198,6 +1238,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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);
Expand Down Expand Up @@ -1494,6 +1536,10 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {

@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);

Expand Down
173 changes: 153 additions & 20 deletions pkg/analysis_server/test/analysis/notification_highlights2_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -26,12 +25,6 @@ void main() {

@reflectiveTest
class AnalysisNotificationHighlightsTest extends HighlightsTestSupport {
@override
List<String> get experiments => [
Feature.inline_class.enableString,
...super.experiments,
];

void assertHighlightText(TestCode testCode, int index, String expected) {
var actual = _getHighlightText(testCode, index);
if (actual != expected) {
Expand Down Expand Up @@ -118,6 +111,159 @@ void f() {
assertNoRegion(HighlightRegionType.BUILT_IN, 'async = false');
}

Future<void> 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<void> 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<void> 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<void> test_BUILT_IN_augment_onExtention() async {
addTestFile('''
augment extension on int {}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onImport() async {
addTestFile('''
import augment 'a.dart';
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'import');
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onInstanceGetter() async {
addTestFile('''
class C {
augment int get g => 0;
}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onInstanceMethod() async {
addTestFile('''
class C {
augment int m() => 0;
}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onInstanceSetter() async {
addTestFile('''
class C {
augment set s(int x) {}
}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onLibrary() async {
addTestFile('''
library augment 'a.dart';
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'library');
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onMixin() async {
addTestFile('''
augment mixin M {}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_augment_onOperator() async {
addTestFile('''
class C {
augment int operator -() => 0;
}
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> 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<void> 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<void> 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<void> 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<void> test_BUILT_IN_augment_onTopLevelVariable() async {
addTestFile('''
augment int v = 0;
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'augment');
}

Future<void> test_BUILT_IN_await() async {
addTestFile('''
void f() async {
Expand Down Expand Up @@ -569,19 +715,6 @@ Never nnn() => throw '';
assertHasRegion(HighlightRegionType.CLASS, 'Never nnn');
}

Future<void> 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<void> test_class_constructor_fieldFormalParameter() async {
var testCode = TestCode.parse(r'''
class A {
Expand Down

0 comments on commit 394538e

Please sign in to comment.