Include enum constants into available declarations.

R=brianwilkerson@google.com

Change-Id: I86c525981119a77ad8b69878f8134d927f873817
Reviewed-on: https://dart-review.googlesource.com/c/92662
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 1173472..adeea7f 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -128,6 +128,8 @@
       return protocol.ElementKind.CLASS_TYPE_ALIAS;
     case DeclarationKind.ENUM:
       return protocol.ElementKind.ENUM;
+    case DeclarationKind.ENUM_CONSTANT:
+      return protocol.ElementKind.ENUM_CONSTANT;
     case DeclarationKind.FUNCTION:
       return protocol.ElementKind.FUNCTION;
     case DeclarationKind.FUNCTION_TYPE_ALIAS:
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 0ed764e..e70747d 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -90,6 +90,7 @@
   CLASS,
   CLASS_TYPE_ALIAS,
   ENUM,
+  ENUM_CONSTANT,
   FUNCTION,
   FUNCTION_TYPE_ALIAS,
   GETTER,
@@ -698,6 +699,9 @@
       case DeclarationKind.FUNCTION_TYPE_ALIAS:
         var name = declaration.name;
         return <String>['$uriStr::$name'];
+      case DeclarationKind.ENUM_CONSTANT:
+        var name2 = declaration.name2;
+        return <String>['$uriStr::$name2'];
       default:
         return null;
     }
@@ -777,6 +781,8 @@
         return DeclarationKind.CLASS_TYPE_ALIAS;
       case idl.AvailableDeclarationKind.ENUM:
         return DeclarationKind.ENUM;
+      case idl.AvailableDeclarationKind.ENUM_CONSTANT:
+        return DeclarationKind.ENUM_CONSTANT;
       case idl.AvailableDeclarationKind.FUNCTION:
         return DeclarationKind.FUNCTION;
       case idl.AvailableDeclarationKind.FUNCTION_TYPE_ALIAS:
@@ -802,6 +808,8 @@
         return idl.AvailableDeclarationKind.CLASS_TYPE_ALIAS;
       case DeclarationKind.ENUM:
         return idl.AvailableDeclarationKind.ENUM;
+      case DeclarationKind.ENUM_CONSTANT:
+        return idl.AvailableDeclarationKind.ENUM_CONSTANT;
       case DeclarationKind.FUNCTION:
         return idl.AvailableDeclarationKind.FUNCTION;
       case DeclarationKind.FUNCTION_TYPE_ALIAS:
@@ -892,7 +900,7 @@
 
 class _File {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 4;
+  static const int DATA_VERSION = 5;
 
   /// The next value for [id].
   static int _nextId = 0;
@@ -1052,16 +1060,28 @@
 
     var lineInfo = unit.lineInfo;
 
+    String docComplete = null;
+    String docSummary = null;
+
+    void setDartDoc(AnnotatedNode node) {
+      if (node.documentationComment != null) {
+        var rawText = getCommentNodeRawText(node.documentationComment);
+        docComplete = getDartDocPlainText(rawText);
+        docSummary = getDartDocSummary(docComplete);
+      } else {
+        docComplete = null;
+        docSummary = null;
+      }
+    }
+
     void addDeclaration({
-      @required String docComplete,
-      @required String docSummary,
       bool isAbstract = false,
       bool isConst = false,
       bool isDeprecated = false,
       bool isFinal = false,
       @required DeclarationKind kind,
       @required Identifier name,
-      String name2,
+      Identifier name2,
       String parameters,
       List<String> parameterNames,
       List<String> parameterTypes,
@@ -1084,7 +1104,7 @@
           locationOffset: locationOffset,
           locationPath: path,
           name: name.name,
-          name2: name2,
+          name2: name2?.name,
           locationStartColumn: lineLocation.columnNumber,
           locationStartLine: lineLocation.lineNumber,
           parameters: parameters,
@@ -1099,20 +1119,11 @@
     }
 
     for (var node in unit.declarations) {
-      String docComplete = null;
-      String docSummary = null;
-      if (node.documentationComment != null) {
-        var rawText = getCommentNodeRawText(node.documentationComment);
-        docComplete = getDartDocPlainText(rawText);
-        docSummary = getDartDocSummary(docComplete);
-      }
-
+      setDartDoc(node);
       var isDeprecated = _hasDeprecatedAnnotation(node);
 
       if (node is ClassDeclaration) {
         addDeclaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
           isAbstract: node.isAbstract,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.CLASS,
@@ -1120,27 +1131,31 @@
         );
       } else if (node is ClassTypeAlias) {
         addDeclaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.CLASS_TYPE_ALIAS,
           name: node.name,
         );
       } else if (node is EnumDeclaration) {
         addDeclaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.ENUM,
           name: node.name,
         );
+        for (var constant in node.constants) {
+          setDartDoc(constant);
+          var isDeprecated = _hasDeprecatedAnnotation(constant);
+          addDeclaration(
+            isDeprecated: isDeprecated,
+            kind: DeclarationKind.ENUM_CONSTANT,
+            name: constant.name,
+            name2: node.name,
+          );
+        }
       } else if (node is FunctionDeclaration) {
         var functionExpression = node.functionExpression;
         var parameters = functionExpression.parameters;
         if (node.isGetter) {
           addDeclaration(
-            docComplete: docComplete,
-            docSummary: docSummary,
             isDeprecated: isDeprecated,
             kind: DeclarationKind.GETTER,
             name: node.name,
@@ -1148,8 +1163,6 @@
           );
         } else if (node.isSetter) {
           addDeclaration(
-            docComplete: docComplete,
-            docSummary: docSummary,
             isDeprecated: isDeprecated,
             kind: DeclarationKind.SETTER,
             name: node.name,
@@ -1161,8 +1174,6 @@
           );
         } else {
           addDeclaration(
-            docComplete: docComplete,
-            docSummary: docSummary,
             isDeprecated: isDeprecated,
             kind: DeclarationKind.FUNCTION,
             name: node.name,
@@ -1179,8 +1190,6 @@
         var functionType = node.functionType;
         var parameters = functionType.parameters;
         addDeclaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.FUNCTION_TYPE_ALIAS,
           name: node.name,
@@ -1193,8 +1202,6 @@
         );
       } else if (node is MixinDeclaration) {
         addDeclaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.MIXIN,
           name: node.name,
@@ -1204,8 +1211,6 @@
         var isFinal = node.variables.isFinal;
         for (var variable in node.variables.variables) {
           addDeclaration(
-            docComplete: docComplete,
-            docSummary: docSummary,
             isConst: isConst,
             isDeprecated: isDeprecated,
             isFinal: isFinal,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 3673aa3..640b861 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -14,6 +14,8 @@
 
   ENUM,
 
+  ENUM_CONSTANT,
+
   FUNCTION,
 
   FUNCTION_TYPE_ALIAS,
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index ba77b62..6e3a1d8 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -360,6 +360,7 @@
   CLASS,
   CLASS_TYPE_ALIAS,
   ENUM,
+  ENUM_CONSTANT,
   FUNCTION,
   FUNCTION_TYPE_ALIAS,
   GETTER,
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 886d3c1..aa2d4a4 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -846,6 +846,51 @@
     );
   }
 
+  test_ENUM_CONSTANT() async {
+    newFile('/home/test/lib/test.dart', content: r'''
+enum MyEnum {
+  a,
+
+  @deprecated
+  b,
+
+  /// aaa
+  ///
+  /// bbb bbb
+  c
+}
+''');
+
+    tracker.addContext(testAnalysisContext);
+    await _doAllTrackerWork();
+
+    var library = _getLibrary('package:test/test.dart');
+    _assertDeclaration(
+      library,
+      'a',
+      DeclarationKind.ENUM_CONSTANT,
+      name2: 'MyEnum',
+      relevanceTags: ['package:test/test.dart::MyEnum'],
+    );
+    _assertDeclaration(
+      library,
+      'b',
+      DeclarationKind.ENUM_CONSTANT,
+      isDeprecated: true,
+      name2: 'MyEnum',
+      relevanceTags: ['package:test/test.dart::MyEnum'],
+    );
+    _assertDeclaration(
+      library,
+      'c',
+      DeclarationKind.ENUM_CONSTANT,
+      docSummary: 'aaa',
+      docComplete: 'aaa\n\nbbb bbb',
+      name2: 'MyEnum',
+      relevanceTags: ['package:test/test.dart::MyEnum'],
+    );
+  }
+
   test_FUNCTION() async {
     newFile('/home/test/lib/test.dart', content: r'''
 void a() {}