Version 2.17.0-19.0.dev

Merge commit '38f013d4d772232407aa6b4245b336e07364d052' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 991fc7c..81f1366 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2667,7 +2667,6 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    linkedData?.read(this);
     return _accessors;
   }
 
@@ -2679,10 +2678,6 @@
     return fields.where((field) => !field.isSynthetic).toList();
   }
 
-  List<FieldElement> get constants_unresolved {
-    return _fields.where((field) => !field.isSynthetic).toList();
-  }
-
   @override
   List<ConstructorElement> get constructors {
     return _constructors;
@@ -2697,7 +2692,6 @@
 
   @override
   List<FieldElement> get fields {
-    linkedData?.read(this);
     return _fields;
   }
 
@@ -2736,7 +2730,6 @@
 
   @override
   List<MethodElement> get methods {
-    linkedData?.read(this);
     return _methods;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index c6522fb..0f6da71 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -406,8 +406,13 @@
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
+        _buildTypeParameterElements(node.typeParameters);
+        node.typeParameters?.accept(this);
+
         _defineElements(element.accessors);
+        _defineElements(element.methods);
         node.constants.accept(this);
+        node.members.accept(this);
       });
     });
   }
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 9d9dadd..3c46109 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -407,11 +407,8 @@
       fields.addAll(
         holder2.properties.whereType<FieldElementImpl>(),
       );
-      accessors.addAll(
-        holder2.propertyAccessors,
-      );
-      // TODO(scheglov) implement
-      // element.methods = holder2.methods;
+      accessors.addAll(holder2.propertyAccessors);
+      methods.addAll(holder2.methods);
     }
 
     // TODO(scheglov) only if no explicit
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 1c3b927..f8c9fdb 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -274,34 +274,28 @@
 
   void _applyToEnumDeclaration(
     ClassElement element,
-    _InfoEnumDeclaration info,
+    _InfoClassDeclaration info,
   ) {
     element as EnumElementImpl;
     element.setCodeRange(info.codeOffset, info.codeLength);
     element.nameOffset = info.nameOffset;
     element.documentationComment = info.documentationComment;
+
     _applyToTypeParameters(
       element.typeParameters_unresolved,
       info.typeParameters,
     );
-
-    forCorrespondingPairs<FieldElement, _InfoEnumConstantDeclaration>(
-      element.constants_unresolved,
-      info.constants,
-      (element, info) {
-        element as FieldElementImpl;
-        element.setCodeRange(info.codeOffset, info.codeLength);
-        element.nameOffset = info.nameOffset;
-        element.documentationComment = info.documentationComment;
-      },
-    );
+    _applyToConstructors(element.constructors, info.constructors);
+    _applyToFields(element.fields, info.fields);
+    _applyToAccessors(element.accessors, info.accessors);
+    _applyToMethods(element.methods, info.methods);
 
     var linkedData = element.linkedData as EnumElementLinkedData;
     linkedData.applyConstantOffsets = ApplyConstantOffsets(
       info.constantOffsets,
       (applier) {
         applier.applyToMetadata(element);
-        applier.applyToEnumConstants(element.constants);
+        applier.applyToTypeParameters(element.typeParameters);
       },
     );
   }
@@ -770,65 +764,6 @@
   });
 }
 
-class _InfoEnumConstantDeclaration {
-  final int codeOffset;
-  final int codeLength;
-  final int nameOffset;
-  final String? documentationComment;
-
-  factory _InfoEnumConstantDeclaration(SummaryDataReader reader) {
-    return _InfoEnumConstantDeclaration._(
-      codeOffset: reader.readUInt30(),
-      codeLength: reader.readUInt30(),
-      nameOffset: reader.readUInt30(),
-      documentationComment: reader.readStringUtf8().nullIfEmpty,
-    );
-  }
-
-  _InfoEnumConstantDeclaration._({
-    required this.codeOffset,
-    required this.codeLength,
-    required this.nameOffset,
-    required this.documentationComment,
-  });
-}
-
-class _InfoEnumDeclaration {
-  final int codeOffset;
-  final int codeLength;
-  final int nameOffset;
-  final String? documentationComment;
-  final List<_InfoTypeParameter> typeParameters;
-  final List<_InfoEnumConstantDeclaration> constants;
-  final Uint32List constantOffsets;
-
-  factory _InfoEnumDeclaration(SummaryDataReader reader) {
-    return _InfoEnumDeclaration._(
-      codeOffset: reader.readUInt30(),
-      codeLength: reader.readUInt30(),
-      nameOffset: reader.readUInt30(),
-      documentationComment: reader.readStringUtf8().nullIfEmpty,
-      typeParameters: reader.readTypedList(
-        () => _InfoTypeParameter(reader),
-      ),
-      constants: reader.readTypedList(
-        () => _InfoEnumConstantDeclaration(reader),
-      ),
-      constantOffsets: reader.readUInt30List(),
-    );
-  }
-
-  _InfoEnumDeclaration._({
-    required this.codeOffset,
-    required this.codeLength,
-    required this.nameOffset,
-    required this.documentationComment,
-    required this.typeParameters,
-    required this.constants,
-    required this.constantOffsets,
-  });
-}
-
 class _InfoExport {
   final int nameOffset;
   final List<_InfoCombinator> combinators;
@@ -1173,15 +1108,14 @@
       sink.writeUInt30(node.name.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
-      sink.writeList2<EnumConstantDeclaration>(node.constants, (node) {
-        sink.writeUInt30(node.offset);
-        sink.writeUInt30(node.length);
-        sink.writeUInt30(node.name.offset);
-        _writeDocumentationComment(node);
-      });
+      _writeConstructors(node.members);
+      _writeEnumFields(node.constants, node.members);
+      _writeGettersSetters(node.members);
+      _writeMethods(node.members);
       _writeOffsets(
         metadata: node.metadata,
         enumConstants: node.constants,
+        typeParameters: node.typeParameters,
       );
     });
 
@@ -1342,27 +1276,57 @@
     sink.writeStringUtf8(commentText ?? '');
   }
 
+  void _writeEnumFields(
+    List<EnumConstantDeclaration> constants,
+    List<ClassMember> members,
+  ) {
+    var fields = members
+        .whereType<FieldDeclaration>()
+        .expand((declaration) => declaration.fields.variables)
+        .toList();
+
+    sink.writeUInt30(constants.length + fields.length);
+
+    // Write constants in the same format as fields.
+    for (var node in constants) {
+      var codeOffset = node.offset;
+      sink.writeUInt30(codeOffset);
+      sink.writeUInt30(node.end - codeOffset);
+      sink.writeUInt30(node.name.offset);
+      _writeDocumentationComment(node);
+      _writeOffsets(
+        metadata: node.metadata,
+      );
+    }
+
+    for (var field in fields) {
+      _writeField(field);
+    }
+  }
+
+  void _writeField(VariableDeclaration node) {
+    var codeOffset = _codeOffsetForVariable(node);
+    sink.writeUInt30(codeOffset);
+    sink.writeUInt30(node.end - codeOffset);
+    sink.writeUInt30(node.name.offset);
+    _writeDocumentationComment(node);
+
+    // TODO(scheglov) Replace with some kind of double-iterating list.
+    var declaration = node.parent!.parent as FieldDeclaration;
+
+    _writeOffsets(
+      metadata: declaration.metadata,
+      constantInitializer: node.initializer,
+    );
+  }
+
   void _writeFields(List<ClassMember> members) {
     sink.writeList<VariableDeclaration>(
       members
           .whereType<FieldDeclaration>()
           .expand((declaration) => declaration.fields.variables)
           .toList(),
-      (node) {
-        var codeOffset = _codeOffsetForVariable(node);
-        sink.writeUInt30(codeOffset);
-        sink.writeUInt30(node.end - codeOffset);
-        sink.writeUInt30(node.name.offset);
-        _writeDocumentationComment(node);
-
-        // TODO(scheglov) Replace with some kind of double-iterating list.
-        var declaration = node.parent!.parent as FieldDeclaration;
-
-        _writeOffsets(
-          metadata: declaration.metadata,
-          constantInitializer: node.initializer,
-        );
-      },
+      _writeField,
     );
   }
 
@@ -1603,7 +1567,7 @@
   final List<_InfoPart> parts;
   final List<_InfoClassDeclaration> classDeclarations;
   final List<_InfoClassTypeAlias> classTypeAliases;
-  final List<_InfoEnumDeclaration> enums;
+  final List<_InfoClassDeclaration> enums;
   final List<_InfoClassDeclaration> extensions;
   final List<_InfoMethodDeclaration> accessors;
   final List<_InfoFunctionDeclaration> functions;
@@ -1636,7 +1600,7 @@
         () => _InfoClassTypeAlias(reader),
       ),
       enums: reader.readTypedList(
-        () => _InfoEnumDeclaration(reader),
+        () => _InfoClassDeclaration(reader),
       ),
       extensions: reader.readTypedList(
         () => _InfoClassDeclaration(reader, nameOffsetDelta: 1),
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 75a6db5..8535a39 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -172,31 +172,31 @@
       }
     }
 
+    void findInClasses(List<ClassElement> classes) {
+      for (var class_ in classes) {
+        findInExecutables(class_.accessors);
+        findInExecutables(class_.constructors);
+        findInExecutables(class_.methods);
+      }
+    }
+
     findInExecutables(unitElement.accessors);
     findInExecutables(unitElement.functions);
 
-    for (var alias in unitElement.typeAliases) {
-      var aliasedElement = alias.aliasedElement;
-      if (aliasedElement is GenericFunctionTypeElement) {
-        findIn(aliasedElement.parameters);
-      }
-    }
+    findInClasses(unitElement.classes);
+    findInClasses(unitElement.enums);
+    findInClasses(unitElement.mixins);
 
     for (var extension_ in unitElement.extensions) {
       findInExecutables(extension_.accessors);
       findInExecutables(extension_.methods);
     }
 
-    for (var mixin in unitElement.mixins) {
-      findInExecutables(mixin.accessors);
-      findInExecutables(mixin.constructors);
-      findInExecutables(mixin.methods);
-    }
-
-    for (var class_ in unitElement.classes) {
-      findInExecutables(class_.accessors);
-      findInExecutables(class_.constructors);
-      findInExecutables(class_.methods);
+    for (var alias in unitElement.typeAliases) {
+      var aliasedElement = alias.aliasedElement;
+      if (aliasedElement is GenericFunctionTypeElement) {
+        findIn(aliasedElement.parameters);
+      }
     }
 
     unit.accept(
@@ -285,6 +285,10 @@
       findInClass(class_);
     }
 
+    for (var enum_ in unitElement.enums) {
+      findInClass(enum_);
+    }
+
     for (var extension_ in unitElement.extensions) {
       findIn(extension_.typeParameters);
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 7d2c061..89c6d3f 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -258,6 +258,7 @@
 
   List<String> get experiments => [
         EnableString.constructor_tearoffs,
+        EnableString.enhanced_enums,
         EnableString.named_arguments_anywhere,
         EnableString.super_parameters,
       ];
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index 1fbf4d9..7fe267d 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -41,6 +41,37 @@
     expect(findElement.field('values').isEnumConstant, isFalse);
   }
 
+  test_method() async {
+    await assertNoErrorsInCode(r'''
+enum E<T> {
+  v;
+  int foo<U>(T t, U u) => 0;
+}
+''');
+
+    assertNamedType(
+      findNode.namedType('T t'),
+      findElement.typeParameter('T'),
+      'T',
+    );
+
+    assertNamedType(
+      findNode.namedType('U u'),
+      findElement.typeParameter('U'),
+      'U',
+    );
+
+    assertSimpleFormalParameter(
+      findNode.simpleFormalParameter('T t'),
+      element: findElement.parameter('t'),
+    );
+
+    assertSimpleFormalParameter(
+      findNode.simpleFormalParameter('U u'),
+      element: findElement.parameter('u'),
+    );
+  }
+
   test_value_underscore() async {
     await assertNoErrorsInCode(r'''
 enum E { _ }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 6a27317..35aaf17 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -704,6 +704,13 @@
     assertType(node.staticType, type);
   }
 
+  void assertSimpleFormalParameter(
+    SimpleFormalParameter node, {
+    required ParameterElement element,
+  }) {
+    assertElement(node.declaredElement, element);
+  }
+
   void assertSimpleIdentifier(
     Expression node, {
     required Object? element,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 5c069d3..ac4593d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17582,6 +17582,98 @@
 ''');
   }
 
+  test_enum_method() async {
+    var library = await checkLibrary(r'''
+enum E<T> {
+  v;
+  int foo<U>(T t, U u) => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @14
+            type: E<dynamic>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: ConstructorMember
+                      base: self::@enum::E::@constructor::_
+                      substitution: {T: dynamic}
+                    staticType: null
+                    token: _ @-1
+                  period: . @0
+                  staticElement: ConstructorMember
+                    base: self::@enum::E::@constructor::_
+                    substitution: {T: dynamic}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<dynamic>
+                staticType: E<dynamic>
+          synthetic static const values @-1
+            type: List<E<dynamic>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<dynamic>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<dynamic>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<dynamic>
+          synthetic static get values @-1
+            returnType: List<E<dynamic>>
+        methods
+          foo @23
+            typeParameters
+              covariant U @27
+            parameters
+              requiredPositional t @32
+                type: T
+              requiredPositional u @37
+                type: U
+            returnType: int
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_typeParameters() async {
     var library = await checkLibrary('''
 enum E<T> {
@@ -28640,6 +28732,107 @@
 ''');
   }
 
+  test_metadata_typeParameter_ofEnum() async {
+    var library = await checkLibrary('''
+const a = 42;
+enum E<@a T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @19
+        typeParameters
+          covariant T @24
+            defaultType: dynamic
+            metadata
+              Annotation
+                atSign: @ @21
+                element: <null>
+                name: SimpleIdentifier
+                  staticElement: <null>
+                  staticType: null
+                  token: a @22
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @31
+            type: E<dynamic>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: ConstructorMember
+                      base: self::@enum::E::@constructor::_
+                      substitution: {T: dynamic}
+                    staticType: null
+                    token: _ @-1
+                  period: . @0
+                  staticElement: ConstructorMember
+                    base: self::@enum::E::@constructor::_
+                    substitution: {T: dynamic}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<dynamic>
+                staticType: E<dynamic>
+          synthetic static const values @-1
+            type: List<E<dynamic>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<dynamic>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<dynamic>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<dynamic>
+          synthetic static get values @-1
+            returnType: List<E<dynamic>>
+        methods
+          synthetic toString @-1
+            returnType: String
+    topLevelVariables
+      static const a @6
+        type: int
+        constantInitializer
+          IntegerLiteral
+            literal: 42 @10
+            staticType: int
+    accessors
+      synthetic static get a @-1
+        returnType: int
+''');
+  }
+
   test_metadata_typeParameter_ofFunction() async {
     var library = await checkLibrary('const a = null; f<@a T>() {}');
     checkElementText(library, r'''
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 8a49df4..d8ec77f 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -1359,7 +1359,7 @@
   // file and expanding them into the resulting argument list.
   //
   // TODO: Move this logic to a single place and share it among all tools.
-  if (arguments.last.startsWith('@')) {
+  if (arguments.length > 0 && arguments.last.startsWith('@')) {
     var extra = _readLines(arguments.last.substring(1));
     arguments = arguments.take(arguments.length - 1).followedBy(extra).toList();
   }
diff --git a/tools/VERSION b/tools/VERSION
index 1a53903..b5e4760 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 18
+PRERELEASE 19
 PRERELEASE_PATCH 0
\ No newline at end of file