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