[analysis_server] Base, interface, and final class and mixin semantic highlighting.

Change-Id: I7262dd6d12787b1cf3f2a0ee6873273f3455423d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/280076
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 49a378e..ad3a4c4 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -690,6 +690,10 @@
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.sealedKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.baseKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.interfaceKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.finalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.name, HighlightRegionType.CLASS);
@@ -701,6 +705,10 @@
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.sealedKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.baseKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.interfaceKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.finalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
     super.visitClassTypeAlias(node);
   }
@@ -1127,6 +1135,10 @@
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
     computer._addRegion_token(node.sealedKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.baseKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.interfaceKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.finalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
     super.visitMixinDeclaration(node);
   }
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index a7893c3..2417e3e 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -173,6 +173,22 @@
     assertHasRegion(HighlightRegionType.KEYWORD, 'in');
   }
 
+  Future<void> test_BUILT_IN_base() async {
+    addTestFile('''
+base class A {}
+base mixin M {}
+base class B = Object with M;
+void f() {
+  var base = 42;
+}
+''');
+    await prepareHighlights();
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'base class A');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'base mixin M');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'base class B');
+    assertNoRegion(HighlightRegionType.BUILT_IN, 'base = 42');
+  }
+
   Future<void> test_BUILT_IN_deferred() async {
     addTestFile('''
 import 'dart:math' deferred as math;
@@ -225,6 +241,22 @@
     assertNoRegion(HighlightRegionType.BUILT_IN, 'factory = 42');
   }
 
+  Future<void> test_BUILT_IN_final() async {
+    addTestFile('''
+final class A {}
+final mixin M {}
+final class B = Object with M;
+void f() {
+  var final = 42;
+}
+''');
+    await prepareHighlights();
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'final class A');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'final mixin M');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'final class B');
+    assertNoRegion(HighlightRegionType.BUILT_IN, 'final = 42');
+  }
+
   Future<void> test_BUILT_IN_Function() async {
     addTestFile('''
 typedef F = void Function();
@@ -286,6 +318,22 @@
     assertNoRegion(HighlightRegionType.BUILT_IN, 'import = 42');
   }
 
+  Future<void> test_BUILT_IN_interface() async {
+    addTestFile('''
+interface class A {}
+interface mixin M {}
+interface class B = Object with M;
+void f() {
+  var interface = 42;
+}
+''');
+    await prepareHighlights();
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'interface class A');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'interface mixin M');
+    assertHasRegion(HighlightRegionType.BUILT_IN, 'interface class B');
+    assertNoRegion(HighlightRegionType.BUILT_IN, 'interface = 42');
+  }
+
   Future<void> test_BUILT_IN_library() async {
     addTestFile('''
 library lib;