Version 2.17.0-72.0.dev
Merge commit '3e6c900d4b487626fee22f8491c18d664c11eb0c' into 'dev'
diff --git a/DEPS b/DEPS
index 56ed123..1ec4625 100644
--- a/DEPS
+++ b/DEPS
@@ -110,7 +110,7 @@
"dart_style_rev": "6f894c0ca33686122be9085f06e5b9bf6ad55262",
"dartdoc_rev" : "f9cfab1b84176873c80b89e7c8b54c669344f9ed",
- "devtools_rev" : "f265c3028d5ed9a454762532bed144fa36b2e4d5",
+ "devtools_rev" : "3b054edf3a14a4a51bc8019f456efcf0073cd626",
"ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
"fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
"file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
index f10269c..d35a1b0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
@@ -12,7 +12,10 @@
/// current library, and get [TypeAnnotation]s from runtime [Type] objects.
abstract class TypeBuilder implements Builder {
/// Adds a new type declaration to the surrounding library.
- void declareType(DeclarationCode typeDeclaration);
+ ///
+ /// The [name] must match the name of the new [typeDeclaration] (this does
+ /// not include any type parameters, just the name).
+ void declareType(String name, DeclarationCode typeDeclaration);
}
/// The interface used to create [StaticType] instances, which are used to
@@ -117,19 +120,19 @@
/// The apis used by [Macro]s that run on classes, to fill in the definitions
/// of any external declarations within that class.
abstract class ClassDefinitionBuilder implements DefinitionBuilder {
- /// Retrieve a [VariableDefinitionBuilder] for a field by [identifier].
+ /// Retrieve a [VariableDefinitionBuilder] for a field with [identifier].
///
/// Throws an [ArgumentError] if [identifier] does not refer to a field in
/// this class.
Future<VariableDefinitionBuilder> buildField(Identifier identifier);
- /// Retrieve a [FunctionDefinitionBuilder] for a method by [identifier].
+ /// Retrieve a [FunctionDefinitionBuilder] for a method with [identifier].
///
/// Throws an [ArgumentError] if [identifier] does not refer to a method in
/// this class.
Future<FunctionDefinitionBuilder> buildMethod(Identifier identifier);
- /// Retrieve a [ConstructorDefinitionBuilder] for a constructor by
+ /// Retrieve a [ConstructorDefinitionBuilder] for a constructor with
/// [identifier].
///
/// Throws an [ArgumentError] if [identifier] does not refer to a constructor
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
index 11fd6c3..d78d9e4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
@@ -131,6 +131,9 @@
/// Whether this function has an `external` modifier.
bool get isExternal;
+ /// Whether this function is an operator.
+ bool get isOperator;
+
/// Whether this function is actually a getter.
bool get isGetter;
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index f01ccb8..27a7915 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -248,6 +248,9 @@
abstract class MacroExecutionResult implements Serializable {
/// Any augmentations that should be applied as a result of executing a macro.
Iterable<DeclarationCode> get augmentations;
+
+ /// The names of any new types declared in [augmentations].
+ Iterable<String> get newTypeNames;
}
/// Each of the possible types of declarations a macro can be applied to
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
index b591a3e..caba317 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
@@ -14,18 +14,25 @@
/// The final result, will be built up over `augment` calls.
final List<DeclarationCode> _augmentations;
+ /// The names of any new types added in [_augmentations].
+ final List<String> _newTypeNames;
+
/// Creates and returns a [MacroExecutionResult] out of the [_augmentations]
/// created by this builder.
- MacroExecutionResult get result =>
- new MacroExecutionResultImpl(augmentations: _augmentations);
+ MacroExecutionResult get result => new MacroExecutionResultImpl(
+ augmentations: _augmentations,
+ newTypeNames: _newTypeNames,
+ );
TypeBuilderBase({List<DeclarationCode>? parentAugmentations})
- : _augmentations = parentAugmentations ?? [];
+ : _augmentations = parentAugmentations ?? [],
+ _newTypeNames = [];
}
class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
@override
- void declareType(DeclarationCode typeDeclaration) {
+ void declareType(String name, DeclarationCode typeDeclaration) {
+ _newTypeNames.add(name);
_augmentations.add(typeDeclaration);
}
}
@@ -250,7 +257,7 @@
Identifier clazz, List<DeclarationCode> augmentations) =>
new DeclarationCode.fromParts([
'augment class ',
- clazz,
+ clazz.name,
' {\n',
...augmentations.joinAsCode('\n'),
'\n}',
@@ -304,13 +311,14 @@
return new DeclarationCode.fromParts([
'augment ',
if (declaration is ConstructorDeclaration) ...[
- declaration.definingClass,
+ declaration.definingClass.name,
if (declaration.identifier.name.isNotEmpty) '.',
] else ...[
declaration.returnType.code,
' ',
+ if (declaration.isOperator) 'operator ',
],
- declaration.identifier,
+ declaration.identifier.name,
if (declaration.typeParameters.isNotEmpty) ...[
'<',
for (TypeParameterDeclaration typeParam
@@ -327,7 +335,7 @@
new ParameterCode.fromParts([
positionalRequired.type.code,
' ',
- positionalRequired.identifier,
+ positionalRequired.identifier.name,
]),
', '
],
@@ -338,7 +346,7 @@
new ParameterCode.fromParts([
positionalOptional.type.code,
' ',
- positionalOptional.identifier,
+ positionalOptional.identifier.name,
]),
', ',
],
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
index 64e5e4f..9fbb7c1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
@@ -288,6 +288,9 @@
final bool isGetter;
@override
+ final bool isOperator;
+
+ @override
final bool isSetter;
@override
@@ -311,6 +314,7 @@
required this.isAbstract,
required this.isExternal,
required this.isGetter,
+ required this.isOperator,
required this.isSetter,
required this.namedParameters,
required this.positionalParameters,
@@ -330,6 +334,7 @@
..addBool(isAbstract)
..addBool(isExternal)
..addBool(isGetter)
+ ..addBool(isOperator)
..addBool(isSetter)
..startList();
for (ParameterDeclarationImpl named in namedParameters) {
@@ -367,6 +372,7 @@
required bool isAbstract,
required bool isExternal,
required bool isGetter,
+ required bool isOperator,
required bool isSetter,
required List<ParameterDeclarationImpl> namedParameters,
required List<ParameterDeclarationImpl> positionalParameters,
@@ -380,6 +386,7 @@
isAbstract: isAbstract,
isExternal: isExternal,
isGetter: isGetter,
+ isOperator: isOperator,
isSetter: isSetter,
namedParameters: namedParameters,
positionalParameters: positionalParameters,
@@ -415,6 +422,7 @@
required bool isAbstract,
required bool isExternal,
required bool isGetter,
+ required bool isOperator,
required bool isSetter,
required List<ParameterDeclarationImpl> namedParameters,
required List<ParameterDeclarationImpl> positionalParameters,
@@ -430,6 +438,7 @@
isAbstract: isAbstract,
isExternal: isExternal,
isGetter: isGetter,
+ isOperator: isOperator,
isSetter: isSetter,
namedParameters: namedParameters,
positionalParameters: positionalParameters,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
index 39d1f61..2e1d0cc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
@@ -209,8 +209,12 @@
@override
final List<DeclarationCode> augmentations;
+ @override
+ final List<String> newTypeNames;
+
MacroExecutionResultImpl({
required this.augmentations,
+ required this.newTypeNames,
});
factory MacroExecutionResultImpl.deserialize(Deserializer deserializer) {
@@ -222,7 +226,19 @@
hasNext = deserializer.moveNext())
deserializer.expectCode()
];
- return new MacroExecutionResultImpl(augmentations: augmentations);
+ deserializer.moveNext();
+ deserializer.expectList();
+ List<String> newTypeNames = [
+ for (bool hasNext = deserializer.moveNext();
+ hasNext;
+ hasNext = deserializer.moveNext())
+ deserializer.expectString()
+ ];
+
+ return new MacroExecutionResultImpl(
+ augmentations: augmentations,
+ newTypeNames: newTypeNames,
+ );
}
void serialize(Serializer serializer) {
@@ -231,5 +247,10 @@
augmentation.serialize(serializer);
}
serializer.endList();
+ serializer.startList();
+ for (String name in newTypeNames) {
+ serializer.addString(name);
+ }
+ serializer.endList();
}
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
index ff8a0b2..d11ec37 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
@@ -117,6 +117,7 @@
isAbstract: (this..moveNext()).expectBool(),
isExternal: (this..moveNext()).expectBool(),
isGetter: (this..moveNext()).expectBool(),
+ isOperator: (this..moveNext()).expectBool(),
isSetter: (this..moveNext()).expectBool(),
namedParameters: (this..moveNext())._expectRemoteInstanceList(),
positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
@@ -131,6 +132,7 @@
isAbstract: (this..moveNext()).expectBool(),
isExternal: (this..moveNext()).expectBool(),
isGetter: (this..moveNext()).expectBool(),
+ isOperator: (this..moveNext()).expectBool(),
isSetter: (this..moveNext()).expectBool(),
namedParameters: (this..moveNext())._expectRemoteInstanceList(),
positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
@@ -146,6 +148,7 @@
isAbstract: (this..moveNext()).expectBool(),
isExternal: (this..moveNext()).expectBool(),
isGetter: (this..moveNext()).expectBool(),
+ isOperator: (this..moveNext()).expectBool(),
isSetter: (this..moveNext()).expectBool(),
namedParameters: (this..moveNext())._expectRemoteInstanceList(),
positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 027c7bb..f8572cf 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2770,6 +2770,23 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumConstructorSuperInitializer =
+ messageEnumConstructorSuperInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumConstructorSuperInitializer = const MessageCode(
+ "EnumConstructorSuperInitializer",
+ problemMessage: r"""Enum constructors can't contain super-initializers.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumConstructorTearoff = messageEnumConstructorTearoff;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumConstructorTearoff = const MessageCode(
+ "EnumConstructorTearoff",
+ problemMessage: r"""Enum constructors can't be torn off.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeEnumDeclarationEmpty = messageEnumDeclarationEmpty;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2799,6 +2816,16 @@
r"""Missing arguments in enum constructor invocation.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumFactoryRedirectsToConstructor =
+ messageEnumFactoryRedirectsToConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumFactoryRedirectsToConstructor = const MessageCode(
+ "EnumFactoryRedirectsToConstructor",
+ problemMessage:
+ r"""Enum factory constructors can't redirect to generative constructors.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeEnumInClass = messageEnumInClass;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2817,6 +2844,15 @@
problemMessage: r"""Enums can't be instantiated.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumNonConstConstructor = messageEnumNonConstConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumNonConstConstructor = const MessageCode(
+ "EnumNonConstConstructor",
+ problemMessage:
+ r"""Generative enum constructors must be marked as 'const'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)>
templateEnumSupertypeOfNonAbstractClass =
const Template<Message Function(String name)>(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index a441a40..6ebcc62 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -7488,19 +7488,33 @@
String? value = token.stringValue;
while (identical(value, 'catch') || identical(value, 'on')) {
- listener.beginCatchClause(token);
+ bool didBeginCatchClause = false;
Token? onKeyword = null;
if (identical(value, 'on')) {
// 'on' type catchPart?
onKeyword = token;
- lastConsumed = computeType(token, /* required = */ true)
- .ensureTypeNotVoid(token, this);
+ TypeInfo typeInfo = computeType(token, /* required = */ true);
+ if (catchCount > 0 && (typeInfo == noType || typeInfo.recovered)) {
+ // Not a valid on-clause and we have enough catch counts to be a valid
+ // try block already.
+ // This could for instance be code like `on([...])` or `on = 42` after
+ // some actual catch/on as that could be a valid method call, local
+ // function, assignment etc.
+ break;
+ }
+ listener.beginCatchClause(token);
+ didBeginCatchClause = true;
+ lastConsumed = typeInfo.ensureTypeNotVoid(token, this);
token = lastConsumed.next!;
value = token.stringValue;
}
Token? catchKeyword = null;
Token? comma = null;
if (identical(value, 'catch')) {
+ if (!didBeginCatchClause) {
+ listener.beginCatchClause(token);
+ didBeginCatchClause = true;
+ }
catchKeyword = token;
Token openParens = catchKeyword.next!;
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
index 78d6908..f3a5cbd 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
@@ -28,6 +28,10 @@
]),
'}',
]),
+ ], newTypeNames: [
+ 'Foo${i}0',
+ 'Foo${i}1',
+ 'Foo${i}2',
]),
];
var library = _TestExecutor().buildAugmentationLibrary(
@@ -88,6 +92,8 @@
barIdentifier,
'();\n}',
]),
+ ], newTypeNames: [
+ 'FooBuilder',
])
];
var library = _TestExecutor().buildAugmentationLibrary(
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
index 502f9f9..aabcf97 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
@@ -165,6 +165,7 @@
isAbstract: true,
isExternal: false,
isGetter: true,
+ isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
@@ -181,6 +182,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: true,
namedParameters: [fooNamedParam],
positionalParameters: [barPositionalParam],
@@ -197,6 +199,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: true,
isSetter: false,
namedParameters: [fooNamedParam],
positionalParameters: [barPositionalParam],
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
index 80136bd..30fac31 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
@@ -68,6 +68,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: false,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'foo'),
namedParameters: [],
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
index 610c83e..79f9b2e 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
@@ -289,40 +289,43 @@
];
}
- builder.declareType(DeclarationCode.fromParts([
- 'class ${clazz.identifier.name}Builder',
- if (clazz.typeParameters.isNotEmpty) ...[
- '<',
- ..._buildTypeParam(clazz.typeParameters.first, true),
- for (var typeParam in clazz.typeParameters.skip(1))
- ..._buildTypeParam(typeParam, false),
- '>',
- ],
- ' implements Builder<',
- clazz.identifier,
- if (clazz.typeParameters.isNotEmpty) ...[
- '<',
- clazz.typeParameters.first.identifier.name,
- for (var typeParam in clazz.typeParameters)
- ', ${typeParam.identifier.name}',
- '>',
- ],
- '> {}'
- ]));
+ var name = '${clazz.identifier.name}Builder';
+ builder.declareType(
+ name,
+ DeclarationCode.fromParts([
+ 'class $name',
+ if (clazz.typeParameters.isNotEmpty) ...[
+ '<',
+ ..._buildTypeParam(clazz.typeParameters.first, true),
+ for (var typeParam in clazz.typeParameters.skip(1))
+ ..._buildTypeParam(typeParam, false),
+ '>',
+ ],
+ ' implements Builder<',
+ clazz.identifier,
+ if (clazz.typeParameters.isNotEmpty) ...[
+ '<',
+ clazz.typeParameters.first.identifier.name,
+ for (var typeParam in clazz.typeParameters)
+ ', ${typeParam.identifier.name}',
+ '>',
+ ],
+ '> {}'
+ ]));
}
@override
FutureOr<void> buildTypesForConstructor(
ConstructorDeclaration constructor, TypeBuilder builder) {
- builder.declareType(DeclarationCode.fromString(
- 'class GeneratedBy${constructor.identifier.name.capitalize()} {}'));
+ var name = 'GeneratedBy${constructor.identifier.name.capitalize()}';
+ builder.declareType(name, DeclarationCode.fromString('class $name {}'));
}
@override
FutureOr<void> buildTypesForField(
FieldDeclaration field, TypeBuilder builder) {
- builder.declareType(DeclarationCode.fromString(
- 'class GeneratedBy${field.identifier.name.capitalize()} {}'));
+ var name = 'GeneratedBy${field.identifier.name.capitalize()}';
+ builder.declareType(name, DeclarationCode.fromString('class $name {}'));
}
@override
@@ -333,23 +336,22 @@
: function.isSetter
? 'Setter'
: '';
- builder.declareType(DeclarationCode.fromString(
- 'class GeneratedBy${function.identifier.name.capitalize()}'
- '$suffix {}'));
+ var name = 'GeneratedBy${function.identifier.name.capitalize()}$suffix';
+ builder.declareType(name, DeclarationCode.fromString('class $name {}'));
}
@override
FutureOr<void> buildTypesForMethod(
MethodDeclaration method, TypeBuilder builder) {
- builder.declareType(DeclarationCode.fromString(
- 'class GeneratedBy${method.identifier.name.capitalize()} {}'));
+ var name = 'GeneratedBy${method.identifier.name.capitalize()}';
+ builder.declareType(name, DeclarationCode.fromString('class $name {}'));
}
@override
FutureOr<void> buildTypesForVariable(
VariableDeclaration variable, TypeBuilder builder) {
- builder.declareType(DeclarationCode.fromString(
- 'class GeneratedBy${variable.identifier.name.capitalize()} {}'));
+ var name = 'GeneratedBy${variable.identifier.name.capitalize()}';
+ builder.declareType(name, DeclarationCode.fromString('class $name {}'));
}
}
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index 4af5f1a..d9c1f51 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -252,6 +252,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
@@ -273,6 +274,7 @@
isAbstract: false,
isExternal: false,
isGetter: true,
+ isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
@@ -285,6 +287,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: true,
namedParameters: [],
positionalParameters: [
@@ -339,6 +342,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
@@ -370,6 +374,7 @@
isAbstract: false,
isExternal: false,
isGetter: false,
+ isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
index badc576..d4e0bf5 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
@@ -4,10 +4,9 @@
* "needs fix", if the code needs a fix, with a possible issue link
* "fixes infeasible", if it has been deemed infeasible to write a fix for this code
-TODO(srawlins): Add lint names not found in LintNames?
-
Stats:
-* 808 "needs evaluation"
+* 793 "needs evaluation"
+* 19 "needs fix"
* 253 "has fix(es)"
AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR: needs evaluation
@@ -58,14 +57,14 @@
CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS: needs evaluation
CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IS_NOT_SWITCH_EXPRESSION_SUBTYPE: needs evaluation
CompileTimeErrorCode.CAST_TO_NON_TYPE: has fix(es)
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER: needs evaluation
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER: needs evaluation
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: needs evaluation
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER: needs evaluation; new in 2.15
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER: needs evaluation; new in 2.15
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: needs evaluation; new in 2.15
CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER: has fix(es)
CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD: needs evaluation
-CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER: needs evaluation
+CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER: needs evaluation; new in 2.15
CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD: needs evaluation
-CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER: needs evaluation
+CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER: needs evaluation; new in 2.15
CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD: needs evaluation
CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES: needs evaluation
CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD: needs evaluation
@@ -106,8 +105,8 @@
CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT: needs evaluation
CompileTimeErrorCode.CONST_WITH_NON_TYPE: has fix(es)
CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS: needs evaluation
-CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_CONSTRUCTOR_TEAROFF: needs evaluation
-CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_FUNCTION_TEAROFF: needs evaluation
+CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_CONSTRUCTOR_TEAROFF: needs evaluation; new in 2.15
+CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_FUNCTION_TEAROFF: needs evaluation; new in 2.15
CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR: needs evaluation
CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT: needs evaluation
CompileTimeErrorCode.CONTINUE_LABEL_ON_SWITCH: needs evaluation
@@ -117,7 +116,7 @@
CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER: needs evaluation
CompileTimeErrorCode.DEFERRED_IMPORT_OF_EXTENSION: needs evaluation
CompileTimeErrorCode.DEFINITELY_UNASSIGNED_LATE_LOCAL_VARIABLE: needs evaluation
-CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION: needs evaluation
+CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION: needs fix; new in 2.15
CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT: needs evaluation
CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME: needs evaluation
CompileTimeErrorCode.DUPLICATE_DEFINITION: needs evaluation
@@ -168,7 +167,7 @@
CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE: needs evaluation
CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND: needs evaluation
CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT: needs evaluation
-CompileTimeErrorCode.GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC: needs evaluation
+CompileTimeErrorCode.GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC: needs fix; new in 2.15
CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES: needs evaluation
CompileTimeErrorCode.GETTER_NOT_SUBTYPE_SETTER_TYPES: needs evaluation
CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY: needs evaluation
@@ -223,7 +222,7 @@
CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER: needs evaluation
CompileTimeErrorCode.INVALID_OVERRIDE: has fix(es)
CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS: needs evaluation
-CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION: needs evaluation
+CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION: needs fix; new in 2.17
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST: needs evaluation
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP: needs evaluation
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET: needs evaluation
@@ -329,7 +328,7 @@
CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY: needs evaluation
CompileTimeErrorCode.PART_OF_NON_PART: needs evaluation
CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY: needs evaluation
-CompileTimeErrorCode.POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT: needs evaluation
+CompileTimeErrorCode.POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT: needs fix; new in 2.17
CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER: needs evaluation
CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT: needs evaluation
CompileTimeErrorCode.PREFIX_SHADOWED_BY_LOCAL_DECLARATION: needs evaluation
@@ -368,9 +367,9 @@
CompileTimeErrorCode.SHARED_DEFERRED_PREFIX: needs evaluation
CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY: needs evaluation
CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL: needs evaluation
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED: needs fix; new in 2.17
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED: needs evaluation; new in 2.17
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL: needs fix; new in 2.17
CompileTimeErrorCode.SUPER_IN_EXTENSION: needs evaluation
CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT: needs evaluation
CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR: needs evaluation
@@ -378,7 +377,7 @@
CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST: needs evaluation
CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY: has fix(es)
CompileTimeErrorCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE: needs evaluation
-CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS: needs evaluation
+CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS: needs evaluation; new in 2.15
CompileTimeErrorCode.THROW_OF_INVALID_TYPE: needs evaluation
CompileTimeErrorCode.TOP_LEVEL_CYCLE: needs evaluation
CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF: needs evaluation
@@ -408,16 +407,16 @@
CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER: has fix(es)
CompileTimeErrorCode.UNDEFINED_FUNCTION: has fix(es)
CompileTimeErrorCode.UNDEFINED_GETTER: has_fix(es)
-CompileTimeErrorCode.UNDEFINED_GETTER_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_GETTER_ON_FUNCTION_TYPE: needs fix; new in 2.15
CompileTimeErrorCode.UNDEFINED_IDENTIFIER: has fix(es)
CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT: has fix(es)
CompileTimeErrorCode.UNDEFINED_METHOD: has fix(es)
-CompileTimeErrorCode.UNDEFINED_METHOD_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_METHOD_ON_FUNCTION_TYPE: needs fix; new in 2.15
CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: has fix(es)
CompileTimeErrorCode.UNDEFINED_OPERATOR: has fix(es)
CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME: has fix(es)
CompileTimeErrorCode.UNDEFINED_SETTER: has fix(es)
-CompileTimeErrorCode.UNDEFINED_SETTER_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_SETTER_ON_FUNCTION_TYPE: needs fix; new in 2.15
CompileTimeErrorCode.UNDEFINED_SUPER_GETTER: needs evaluation
CompileTimeErrorCode.UNDEFINED_SUPER_METHOD: needs evaluation
CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR: needs evaluation
@@ -427,7 +426,7 @@
CompileTimeErrorCode.URI_DOES_NOT_EXIST: has fix(es)
CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED: needs evaluation
CompileTimeErrorCode.URI_WITH_INTERPOLATION: needs evaluation
-CompileTimeErrorCode.USE_OF_NATIVE_EXTENSION: needs evaluation
+CompileTimeErrorCode.USE_OF_NATIVE_EXTENSION: needs evaluation; compile-time error as of ~2.15
CompileTimeErrorCode.USE_OF_VOID_RESULT: needs evaluation
CompileTimeErrorCode.VARIABLE_TYPE_MISMATCH: needs evaluation
CompileTimeErrorCode.WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE: needs evaluation
@@ -435,10 +434,10 @@
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS: needs evaluation
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER: needs evaluation
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: has fix(es)
-CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION: needs evaluation
+CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION: needs fix; new in 2.15
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: has fix(es)
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: has fix(es)
-CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION: needs evaluation
+CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION: needs fix; new in ~2.15
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: has fix(es)
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE: needs evaluation
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION: needs evaluation
@@ -446,24 +445,23 @@
CompileTimeErrorCode.YIELD_IN_NON_GENERATOR: needs evaluation
CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE: needs evaluation
CompileTimeErrorCode.YIELD_OF_INVALID_TYPE: has fix(es)
-FfiCode.ABI_SPECIFIC_INTEGER_INVALID: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED: needs evaluation
+FfiCode.ABI_SPECIFIC_INTEGER_INVALID: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED: needs evaluation; new in ~2.16
FfiCode.ANNOTATION_ON_POINTER_FIELD: needs evaluation
FfiCode.ARGUMENT_MUST_BE_A_CONSTANT: needs evaluation
-FfiCode.CREATION_OF_STRUCT_OR_UNION: needs evaluation
+FfiCode.CREATION_OF_STRUCT_OR_UNION: needs evaluation; new in ~2.15
FfiCode.EMPTY_STRUCT: needs evaluation
FfiCode.EXTRA_ANNOTATION_ON_STRUCT_FIELD: needs evaluation
FfiCode.EXTRA_SIZE_ANNOTATION_CARRAY: needs evaluation
-FfiCode.FFI_NATIVE_MUST_BE_EXTERNAL: needs evaluation
- FfiCode
- .FFI_NATIVE_ONLY_CLASSES_EXTENDING_NATIVEFIELDWRAPPERCLASS1_CAN_BE_POINTER: needs evaluation
-FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS: needs evaluation
-FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER: needs evaluation
+FfiCode.FFI_NATIVE_MUST_BE_EXTERNAL: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_ONLY_CLASSES_EXTENDING_NATIVEFIELDWRAPPERCLASS1_CAN_BE_POINTER: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER: needs evaluation; new in ~2.15
FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER: needs evaluation
FfiCode.FIELD_INITIALIZER_IN_STRUCT: needs evaluation
-FfiCode.FIELD_MUST_BE_EXTERNAL_IN_STRUCT: needs evaluation
+FfiCode.FIELD_MUST_BE_EXTERNAL_IN_STRUCT: needs evaluation; new in ~2.15
FfiCode.GENERIC_STRUCT_SUBCLASS: needs evaluation
FfiCode.INVALID_EXCEPTION_VALUE: needs evaluation
FfiCode.INVALID_FIELD_TYPE_IN_STRUCT: needs evaluation
@@ -550,11 +548,11 @@
HintCode.INVALID_SEALED_ANNOTATION: has fix(es)
HintCode.INVALID_USE_OF_INTERNAL_MEMBER: needs evaluation
HintCode.INVALID_USE_OF_PROTECTED_MEMBER: needs evaluation
-HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER: needs evaluation
+HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER: needs evaluation; new in ~2.15
HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER: needs evaluation
HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER: needs evaluation
HintCode.INVALID_VISIBILITY_ANNOTATION: needs evaluation
-HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION: needs evaluation
+HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION: needs fix; new in ~2.15
HintCode.MISSING_REQUIRED_PARAM: has fix(es)
HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS: has fix(es)
HintCode.MISSING_RETURN: needs evaluation
@@ -563,7 +561,7 @@
HintCode.MUST_CALL_SUPER: needs fix; https://github.com/dart-lang/sdk/issues/33985
HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR: needs evaluation
HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW: needs evaluation
-HintCode.NULL_ARGUMENT_TO_NON_NULL_TYPE: needs evaluation
+HintCode.NULL_ARGUMENT_TO_NON_NULL_TYPE: needs evaluation; new in ~2.15
HintCode.NULL_AWARE_BEFORE_OPERATOR: needs evaluation
HintCode.NULL_AWARE_IN_CONDITION: needs evaluation
HintCode.NULL_AWARE_IN_LOGICAL_OPERATOR: needs evaluation
@@ -581,7 +579,7 @@
HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT: has fix(es)
HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE: has fix(es)
HintCode.SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT: has fix(es)
-HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS: needs evaluation
+HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS: needs fix; new in 2.15
HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT: has fix(es)
HintCode.SDK_VERSION_EXTENSION_METHODS: has fix(es)
HintCode.SDK_VERSION_GT_GT_GT_OPERATOR: has fix(es)
@@ -607,8 +605,8 @@
HintCode.UNNECESSARY_QUESTION_MARK: needs evaluation
HintCode.UNNECESSARY_TYPE_CHECK_FALSE: needs fix; https://github.com/dart-lang/sdk/issues/47793
HintCode.UNNECESSARY_TYPE_CHECK_TRUE: needs fix; https://github.com/dart-lang/sdk/issues/47793
-HintCode.TEXT_DIRECTION_CODE_POINT_IN_COMMENT: needs evaluation
-HintCode.TEXT_DIRECTION_CODE_POINT_IN_LITERAL: needs evaluation
+HintCode.TEXT_DIRECTION_CODE_POINT_IN_COMMENT: needs fix; new in ~2.16
+HintCode.TEXT_DIRECTION_CODE_POINT_IN_LITERAL: needs fix; new in ~2.16
HintCode.UNUSED_CATCH_CLAUSE: has fix(es)
HintCode.UNUSED_CATCH_STACK: has fix(es)
HintCode.UNUSED_ELEMENT: has fix(es)
@@ -868,7 +866,7 @@
ParserErrorCode.CONST_METHOD: needs evaluation
ParserErrorCode.CONST_TYPEDEF: needs evaluation
ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE: needs evaluation
-ParserErrorCode.CONSTRUCTOR_WITH_TYPE_ARGUMENTS: needs evaluation
+ParserErrorCode.CONSTRUCTOR_WITH_TYPE_ARGUMENTS: needs evaluation; new in ~2.15
ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP: needs evaluation
ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE: needs evaluation
ParserErrorCode.COVARIANT_AND_STATIC: needs evaluation
@@ -1045,20 +1043,20 @@
ParserErrorCode.WITH_BEFORE_EXTENDS: needs evaluation
ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER: needs evaluation
ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP: needs evaluation
-PubspecWarningCode.ASSET_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.ASSET_FIELD_NOT_LIST: needs evaluation
-PubspecWarningCode.ASSET_NOT_STRING: needs evaluation
-PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP: needs evaluation
-PubspecWarningCode.DEPRECATED_FIELD: needs evaluation
-PubspecWarningCode.FLUTTER_FIELD_NOT_MAP: needs evaluation
+PubspecWarningCode.ASSET_DOES_NOT_EXIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_FIELD_NOT_LIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_NOT_STRING: needs evaluation; new in ~2.15
+PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP: needs evaluation; new in ~2.15
+PubspecWarningCode.DEPRECATED_FIELD: needs evaluation; new in ~2.15
+PubspecWarningCode.FLUTTER_FIELD_NOT_MAP: needs evaluation; new in ~2.15
PubspecWarningCode.INVALID_DEPENDENCY: needs evaluation
-PubspecWarningCode.MISSING_NAME: needs evaluation
-PubspecWarningCode.NAME_NOT_STRING: needs evaluation
+PubspecWarningCode.MISSING_NAME: needs evaluation; new in ~2.15
+PubspecWarningCode.NAME_NOT_STRING: needs evaluation; new in ~2.15
PubspecWarningCode.PATH_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.PATH_NOT_POSIX: needs evaluation
+PubspecWarningCode.PATH_NOT_POSIX: needs evaluation; new in ~2.15
PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY: needs evaluation
+PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY: needs evaluation; new in ~2.15
ScannerErrorCode.EXPECTED_TOKEN: needs evaluation
ScannerErrorCode.ILLEGAL_CHARACTER: needs evaluation
ScannerErrorCode.MISSING_DIGIT: needs evaluation
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 52c2abf..848a1e8 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -4,12 +4,11 @@
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
+import '../domain_completion_test.dart';
import '../services/completion/dart/completion_check.dart';
import '../services/completion/dart/completion_contributor_util.dart';
import 'impl/completion_driver.dart';
@@ -23,14 +22,14 @@
});
}
-abstract class AbstractCompletionDriverTest with ResourceProviderMixin {
+abstract class AbstractCompletionDriverTest
+ extends PubPackageAnalysisServerTest {
late CompletionDriver driver;
- Map<String, String> packageRoots = {};
late List<CompletionSuggestion> suggestions;
- String get projectName => 'project';
-
- String get projectPath => '/$projectName';
+ bool get isProtocolVersion2 {
+ return protocol == TestingCompletionProtocol.version2;
+ }
TestingCompletionProtocol get protocol;
@@ -38,14 +37,12 @@
bool get supportsAvailableSuggestions;
- String get testFilePath => '$projectPath/bin/test.dart';
-
Future<void> addProjectFile(String relativePath, String content) async {
- newFile('$projectPath/$relativePath', content: content);
+ newFile('$testPackageRootPath/$relativePath', content: content);
// todo (pq): handle more than lib
expect(relativePath, startsWith('lib/'));
var packageRelativePath = relativePath.substring(4);
- var uriStr = 'package:$projectName/$packageRelativePath';
+ var uriStr = 'package:test/$packageRelativePath';
await driver.waitForSetWithUri(uriStr);
}
@@ -148,23 +145,20 @@
}
}
- @mustCallSuper
+ @override
Future<void> setUp() async {
+ super.setUp();
+
+ writeTestPackagePubspecYamlFile(r'''
+name: test
+''');
+
driver = CompletionDriver(
supportsAvailableSuggestions: supportsAvailableSuggestions,
- projectPath: projectPath,
- testFilePath: testFilePath,
- resourceProvider: resourceProvider,
- serverOptions: serverOptions,
+ server: this,
);
- await driver.createProject(packageRoots: packageRoots);
+ await driver.createProject();
- newPubspecYamlFile(projectPath, '''
-name: project
-''');
- newDotPackagesFile(projectPath, content: '''
-project:${toUri('$projectPath/lib')}
-''');
// todo (pq): add logic (possibly to driver) that waits for SDK suggestions
}
@@ -310,9 +304,6 @@
@override
bool get supportsAvailableSuggestions => true;
- @override
- String get testFilePath => '$projectPath/lib/test.dart';
-
Future<void> test_project_filterImports_defaultConstructor() async {
await addProjectFile('lib/a.dart', r'''
class A {}
diff --git a/pkg/analysis_server/test/client/impl/abstract_client.dart b/pkg/analysis_server/test/client/impl/abstract_client.dart
deleted file mode 100644
index d1ad27f..0000000
--- a/pkg/analysis_server/test/client/impl/abstract_client.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/protocol/protocol.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart'
- hide AnalysisOptions;
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analysis_server/src/domain_completion.dart';
-import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:matcher/matcher.dart';
-import 'package:meta/meta.dart';
-
-import '../../mocks.dart';
-
-abstract class AbstractClient {
- final MockServerChannel serverChannel;
- final TestPluginManager pluginManager;
- late AnalysisServer server;
-
- final List<GeneralAnalysisService> generalServices =
- <GeneralAnalysisService>[];
- final Map<AnalysisService, List<String>> analysisSubscriptions = {};
-
- final String projectPath;
- final String testFilePath;
- late String testCode;
-
- final AnalysisServerOptions serverOptions;
-
- AbstractClient({
- required this.projectPath,
- required this.testFilePath,
- required String sdkPath,
- required this.serverOptions,
- }) : serverChannel = MockServerChannel(),
- pluginManager = TestPluginManager() {
- server = createAnalysisServer(sdkPath);
- var notificationStream = serverChannel.notificationController.stream;
- notificationStream.listen((Notification notification) {
- processNotification(notification);
- });
- }
-
- AnalysisDomainHandler get analysisHandler =>
- server.handlers.singleWhere((handler) => handler is AnalysisDomainHandler)
- as AnalysisDomainHandler;
-
- AnalysisOptions get analysisOptions => testDriver.analysisOptions;
-
- CompletionDomainHandler get completionHandler =>
- server.handlers.whereType<CompletionDomainHandler>().single;
-
- MemoryResourceProvider get resourceProvider;
-
- AnalysisDriver get testDriver => server.getAnalysisDriver(testFilePath)!;
-
- void addAnalysisOptionsFile(String content) {
- newFile(
- resourceProvider.pathContext.join(projectPath, 'analysis_options.yaml'),
- content);
- }
-
- void addAnalysisSubscription(AnalysisService service, String file) {
- // add file to subscription
- var files = analysisSubscriptions[service];
- if (files == null) {
- files = <String>[];
- analysisSubscriptions[service] = files;
- }
- files.add(file);
- // set subscriptions
- var request =
- AnalysisSetSubscriptionsParams(analysisSubscriptions).toRequest('0');
- handleSuccessfulRequest(request);
- }
-
- void addGeneralAnalysisSubscription(GeneralAnalysisService service) {
- generalServices.add(service);
- var request =
- AnalysisSetGeneralSubscriptionsParams(generalServices).toRequest('0');
- handleSuccessfulRequest(request);
- }
-
- String addTestFile(String content) {
- newFile(testFilePath, content);
- testCode = content;
- return testFilePath;
- }
-
- void assertValidId(String id) {
- expect(id, isNotNull);
- expect(id.isNotEmpty, isTrue);
- }
-
- /// Create an analysis server with the given [sdkPath].
- AnalysisServer createAnalysisServer(String sdkPath) {
- createMockSdk(
- resourceProvider: resourceProvider,
- root: newFolder(sdkPath),
- );
- return AnalysisServer(
- serverChannel,
- resourceProvider,
- serverOptions,
- DartSdkManager(sdkPath),
- CrashReportingAttachmentsBuilder.empty,
- InstrumentationService.NULL_SERVICE);
- }
-
- /// Create a project at [projectPath].
- @mustCallSuper
- Future<void> createProject({Map<String, String>? packageRoots}) async {
- newFolder(projectPath);
-
- await setRoots(
- included: [projectPath], excluded: [], packageRoots: packageRoots);
- }
-
- void expect(actual, matcher, {String reason});
-
- /// Validate that the given [request] is handled successfully.
- Response handleSuccessfulRequest(Request request, {RequestHandler? handler}) {
- handler ??= analysisHandler;
- var response = handler.handleRequest(request, NotCancelableToken())!;
- expect(response, isResponseSuccess(request.id));
- return response;
- }
-
- File newFile(String path, String content);
-
- Folder newFolder(String path);
-
- void processNotification(Notification notification);
-
- Future<Response> setRoots({
- required List<String> included,
- required List<String> excluded,
- Map<String, String>? packageRoots,
- }) async {
- var request = AnalysisSetAnalysisRootsParams(included, excluded,
- packageRoots: packageRoots)
- .toRequest('0');
- var response = await waitResponse(request);
- expect(response, isResponseSuccess(request.id));
- return response;
- }
-
- /// Returns a [Future] that completes when the server's analysis is complete.
- Future waitForTasksFinished() => server.onAnalysisComplete;
-
- /// Completes with a successful [Response] for the given [request].
- /// Otherwise fails.
- Future<Response> waitResponse(Request request,
- {bool throwOnError = true}) async {
- return serverChannel.sendRequest(request, throwOnError: throwOnError);
- }
-}
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index 4907915..4c4cafb 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -9,15 +9,12 @@
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart'
hide AnalysisOptions;
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:matcher/matcher.dart';
import 'package:meta/meta.dart';
import '../../constants.dart';
-import 'abstract_client.dart';
+import '../../domain_completion_test.dart';
import 'expect_mixin.dart';
CompletionSuggestion _createCompletionSuggestionFromAvailableSuggestion(
@@ -39,9 +36,16 @@
}
}
+ // todo (pq): in IDEA, this is "UNKNOWN" but here we need a value; figure out what's up.
+ var suggestionKind = CompletionSuggestionKind.IDENTIFIER;
+ if (suggestion.element.kind == ElementKind.CONSTRUCTOR ||
+ suggestion.element.kind == ElementKind.FUNCTION ||
+ suggestion.element.kind == ElementKind.METHOD) {
+ suggestionKind = CompletionSuggestionKind.INVOCATION;
+ }
+
return CompletionSuggestion(
- // todo (pq): in IDEA, this is "UNKNOWN" but here we need a value; figure out what's up.
- CompletionSuggestionKind.INVOCATION,
+ suggestionKind,
suggestionSetRelevance + relevanceBoost,
suggestion.label,
0,
@@ -56,9 +60,9 @@
);
}
-class CompletionDriver extends AbstractClient with ExpectMixin {
+class CompletionDriver with ExpectMixin {
+ final PubPackageAnalysisServerTest server;
final bool supportsAvailableSuggestions;
- final MemoryResourceProvider _resourceProvider;
Map<String, Completer<void>> receivedSuggestionsCompleters = {};
List<CompletionSuggestion> suggestions = [];
@@ -78,51 +82,53 @@
CompletionDriver({
required this.supportsAvailableSuggestions,
- AnalysisServerOptions? serverOptions,
- required MemoryResourceProvider resourceProvider,
- required String projectPath,
- required String testFilePath,
- }) : _resourceProvider = resourceProvider,
- super(
- serverOptions: serverOptions ?? AnalysisServerOptions(),
- projectPath: resourceProvider.convertPath(projectPath),
- testFilePath: resourceProvider.convertPath(testFilePath),
- sdkPath: resourceProvider.convertPath('/sdk'));
+ required this.server,
+ }) {
+ server.serverChannel.notificationController.stream
+ .listen((Notification notification) {
+ processNotification(notification);
+ });
+ }
- @override
- MemoryResourceProvider get resourceProvider => _resourceProvider;
-
- @override
- String addTestFile(String content, {int? offset}) {
+ void addTestFile(String content, {int? offset}) {
completionOffset = content.indexOf('^');
if (offset != null) {
expect(completionOffset, -1, reason: 'cannot supply offset and ^');
completionOffset = offset;
- return super.addTestFile(content);
+ server.newFile(server.testFilePath, content: content);
+ } else {
+ expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
+ var nextOffset = content.indexOf('^', completionOffset + 1);
+ expect(nextOffset, equals(-1), reason: 'too many ^');
+ server.newFile(server.testFilePath,
+ content: content.substring(0, completionOffset) +
+ content.substring(completionOffset + 1));
}
- expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
- var nextOffset = content.indexOf('^', completionOffset + 1);
- expect(nextOffset, equals(-1), reason: 'too many ^');
- return super.addTestFile(content.substring(0, completionOffset) +
- content.substring(completionOffset + 1));
}
- @override
- Future<void> createProject({Map<String, String>? packageRoots}) async {
- await super.createProject(packageRoots: packageRoots);
+ void assertValidId(String id) {
+ expect(id, isNotNull);
+ expect(id.isNotEmpty, isTrue);
+ }
+
+ Future<void> createProject() async {
+ await server.setRoots(included: [server.workspaceRootPath], excluded: []);
+
if (supportsAvailableSuggestions) {
- var request = CompletionSetSubscriptionsParams(
- [CompletionService.AVAILABLE_SUGGESTION_SETS]).toRequest('0');
- handleSuccessfulRequest(request, handler: completionHandler);
+ await server.handleRequest(
+ CompletionSetSubscriptionsParams([
+ CompletionService.AVAILABLE_SUGGESTION_SETS,
+ ]).toRequest('0'),
+ );
}
}
Future<List<CompletionSuggestion>> getSuggestions() async {
- await waitForTasksFinished();
-
- var request = CompletionGetSuggestionsParams(testFilePath, completionOffset)
- .toRequest('0');
- var response = await waitResponse(request);
+ var request = CompletionGetSuggestionsParams(
+ server.testFilePath,
+ completionOffset,
+ ).toRequest('0');
+ var response = await server.handleRequest(request);
var result = CompletionGetSuggestionsResult.fromResponse(response);
completionId = result.id;
assertValidId(completionId);
@@ -131,30 +137,19 @@
}
Future<List<CompletionSuggestion>> getSuggestions2() async {
- await waitForTasksFinished();
-
var request = CompletionGetSuggestions2Params(
- testFilePath,
+ server.testFilePath,
completionOffset,
1 << 16,
timeout: 60 * 1000,
).toRequest('0');
- var response = await waitResponse(request);
+ var response = await server.handleRequest(request);
var result = CompletionGetSuggestions2Result.fromResponse(response);
replacementOffset = result.replacementOffset;
replacementLength = result.replacementLength;
return result.suggestions;
}
- @override
- File newFile(String path, String content) =>
- resourceProvider.newFile(resourceProvider.convertPath(path), content);
-
- @override
- Folder newFolder(String path) =>
- resourceProvider.newFolder(resourceProvider.convertPath(path));
-
- @override
@mustCallSuper
Future<void> processNotification(Notification notification) async {
if (notification.event == COMPLETION_RESULTS) {
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 82c6e44..608f706 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -149,7 +149,7 @@
testFilePathPlatform, 0, 'Random', '[foo]:bar')
.toRequest('0');
- var response = await _handleRequest(request);
+ var response = await handleRequest(request);
expect(response.error?.code, RequestErrorCode.INVALID_PARAMETER);
// TODO(scheglov) Check that says "libraryUri".
}
@@ -161,7 +161,7 @@
CompletionGetSuggestionDetails2Params('foo', 0, 'Random', 'dart:math')
.toRequest('0');
- var response = await _handleRequest(request);
+ var response = await handleRequest(request);
expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT);
}
@@ -1918,7 +1918,7 @@
0,
1 << 10,
).toRequest(id);
- var futureResponse = _handleRequest(request);
+ var futureResponse = handleRequest(request);
return RequestWithFutureResponse(offset, request, futureResponse);
}
}
@@ -2862,6 +2862,10 @@
String get workspaceRootPath => '/home';
+ Future<Response> handleRequest(Request request) async {
+ return await serverChannel.sendRequest(request);
+ }
+
Future<void> setRoots({
required List<String> included,
required List<String> excluded,
@@ -2877,6 +2881,7 @@
);
}
+ @mustCallSuper
void setUp() {
serverChannel = MockServerChannel();
@@ -2935,13 +2940,9 @@
await server.onAnalysisComplete;
}
- Future<Response> _handleRequest(Request request) async {
- return await serverChannel.sendRequest(request);
- }
-
/// Validates that the given [request] is handled successfully.
Future<Response> _handleSuccessfulRequest(Request request) async {
- var response = await _handleRequest(request);
+ var response = await handleRequest(request);
expect(response, isResponseSuccess(request.id));
return response;
}
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index 57a911e..de00669 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -179,6 +179,16 @@
element.isNotNull.kind.isConstructor;
}
+ void get isEnum {
+ kind.isIdentifier;
+ element.isNotNull.kind.isEnum;
+ }
+
+ void get isEnumConstant {
+ kind.isIdentifier;
+ element.isNotNull.kind.isEnumConstant;
+ }
+
void get isField {
kind.isIdentifier;
element.isNotNull.kind.isField;
@@ -194,6 +204,11 @@
element.isNotNull.kind.isGetter;
}
+ void get isImportPrefix {
+ kind.isIdentifier;
+ element.isNotNull.kind.isPrefix;
+ }
+
void get isMethodInvocation {
kind.isInvocation;
element.isNotNull.kind.isMethod;
@@ -381,6 +396,14 @@
isEqualTo(ElementKind.CONSTRUCTOR);
}
+ void get isEnum {
+ isEqualTo(ElementKind.ENUM);
+ }
+
+ void get isEnumConstant {
+ isEqualTo(ElementKind.ENUM_CONSTANT);
+ }
+
void get isField {
isEqualTo(ElementKind.FIELD);
}
@@ -401,6 +424,10 @@
isEqualTo(ElementKind.PARAMETER);
}
+ void get isPrefix {
+ isEqualTo(ElementKind.PREFIX);
+ }
+
void get isSetter {
isEqualTo(ElementKind.SETTER);
}
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
index 842ac90..1cbdf28 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
@@ -31,57 +31,285 @@
@override
bool get supportsAvailableSuggestions => true;
- Future<void> test_unprefixed_imported() async {
+ Future<void> test_enumConstantName() async {
+ await _check_locations(
+ declaration: 'enum MyEnum { foo01 }',
+ codeAtCompletion: 'foo0^',
+ validator: (response) {
+ check(response).hasReplacement(left: 4);
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.matches([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum.foo01')
+ ..isEnumConstant,
+ ]);
+ // No other suggestions.
+ } else {
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum.foo01')
+ ..isEnumConstant,
+ // The response includes much more, such as `MyEnum` itself.
+ // We don't expect though that the client will show it.
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ ]);
+ }
+ },
+ );
+ }
+
+ Future<void> test_enumConstantName_imported_withPrefix() async {
+ await addProjectFile('lib/a.dart', r'''
+enum MyEnum { foo01 }
+''');
+
+ var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+ foo0^
+}
+''');
+
+ check(response).hasReplacement(left: 4);
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.matches([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix.MyEnum.foo01')
+ ..isEnumConstant,
+ ]);
+ } else {
+ // TODO(scheglov) This is wrong.
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum.foo01')
+ ..isEnumConstant,
+ ]);
+ }
+ }
+
+ Future<void> test_enumName() async {
+ await _check_locations(
+ declaration: 'enum MyEnum { foo01 }',
+ codeAtCompletion: 'MyEnu^',
+ validator: (response) {
+ check(response).hasReplacement(left: 5);
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.matches([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ ]);
+ // No enum constants.
+ } else {
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ ]);
+ }
+ },
+ );
+ }
+
+ Future<void> test_enumName_imported_withPrefix() async {
+ await addProjectFile('lib/a.dart', r'''
+enum MyEnum { foo01 }
+''');
+
+ var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+ MyEnu^
+}
+''');
+
+ check(response).hasReplacement(left: 5);
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.matches([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix.MyEnum')
+ ..isEnum,
+ ]);
+ } else {
+ // TODO(scheglov) This is wrong.
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ ]);
+ }
+ }
+
+ @FailingTest(reason: 'element.kind is LIBRARY')
+ Future<void> test_importPrefix() async {
await addProjectFile('lib/a.dart', r'''
enum MyEnum { v }
''');
var response = await getTestCodeSuggestions('''
-import 'a.dart';
+import 'a.dart' as prefix01;
void f() {
- ^
+ prefix0^
}
''');
- _checkUnprefixed(response);
+ check(response).hasReplacement(left: 7);
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.matches([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix01')
+ ..isImportPrefix,
+ ]);
+ } else {
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix01')
+ ..isImportPrefix,
+ ]);
+ }
}
- Future<void> test_unprefixed_local() async {
- var response = await getTestCodeSuggestions('''
-enum MyEnum { v }
-
-void f() {
- ^
-}
-''');
-
- _checkUnprefixed(response);
- }
-
- Future<void> test_unprefixed_notImported() async {
+ Future<void> test_importPrefix_dot() async {
await addProjectFile('lib/a.dart', r'''
enum MyEnum { v }
''');
var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
void f() {
- ^
+ prefix.^
}
''');
- _checkUnprefixed(response);
- }
+ check(response).hasEmptyReplacement();
- void _checkUnprefixed(CompletionResponseForTesting response) {
check(response).suggestions
..includesAll([
- (suggestion) => suggestion.completion.isEqualTo('MyEnum.v'),
- ])
- ..excludesAll([
(suggestion) => suggestion
- ..completion.startsWith('MyEnum')
- ..isConstructorInvocation,
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ ])
+ // TODO(scheglov) This is wrong.
+ // Should include constants, as [test_nothing_imported_withPrefix] does.
+ ..excludesAll([
+ (suggestion) => suggestion.isEnumConstant,
]);
}
+
+ Future<void> test_nothing() async {
+ await _check_locations(
+ declaration: 'enum MyEnum { v }',
+ codeAtCompletion: '^',
+ validator: (response) {
+ check(response).hasEmptyReplacement();
+
+ check(response).suggestions
+ ..includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum.v')
+ ..isEnumConstant,
+ ])
+ ..excludesAll([
+ (suggestion) => suggestion
+ ..completion.startsWith('MyEnum')
+ ..isConstructorInvocation,
+ ]);
+ },
+ );
+ }
+
+ Future<void> test_nothing_imported_withPrefix() async {
+ await addProjectFile('lib/a.dart', r'''
+enum MyEnum { v }
+''');
+
+ var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+ ^
+}
+''');
+
+ check(response).hasEmptyReplacement();
+
+ if (isProtocolVersion2) {
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix.MyEnum')
+ ..isEnum,
+ (suggestion) => suggestion
+ ..completion.isEqualTo('prefix.MyEnum.v')
+ ..isEnumConstant,
+ ]);
+ } else {
+ // TODO(scheglov) This is wrong.
+ check(response).suggestions.includesAll([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum')
+ ..isEnum,
+ (suggestion) => suggestion
+ ..completion.isEqualTo('MyEnum.v')
+ ..isEnumConstant,
+ ]);
+ }
+ }
+
+ Future<void> _check_locations({
+ required String declaration,
+ required String codeAtCompletion,
+ required void Function(CompletionResponseForTesting response) validator,
+ }) async {
+ // local
+ {
+ var response = await getTestCodeSuggestions('''
+$declaration
+void f() {
+ $codeAtCompletion
+}
+''');
+ validator(response);
+ }
+
+ // imported
+ {
+ await addProjectFile('lib/a.dart', '''
+$declaration
+''');
+ var response = await getTestCodeSuggestions('''
+import 'a.dart';
+void f() {
+ $codeAtCompletion
+}
+''');
+ validator(response);
+ }
+
+ // not imported
+ {
+ await addProjectFile('lib/a.dart', '''
+$declaration
+''');
+ var response = await getTestCodeSuggestions('''
+void f() {
+ $codeAtCompletion
+}
+''');
+ validator(response);
+ }
+ }
}
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
similarity index 67%
rename from pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
rename to pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
index d63a695..b34836b 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
@@ -1,55 +1,58 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
-import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer_utilities/check/check.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'completion_check.dart';
-import 'completion_contributor_util.dart';
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
void main() {
defineReflectiveSuite(() {
- defineReflectiveTests(FieldFormalContributorTest);
+ defineReflectiveTests(FieldFormalParameterTest1);
+ defineReflectiveTests(FieldFormalParameterTest2);
});
}
@reflectiveTest
-class FieldFormalContributorTest extends DartCompletionContributorTest {
+class FieldFormalParameterTest1 extends AbstractCompletionDriverTest
+ with SuperFormalParameterTestCases {
@override
- DartCompletionContributor createContributor(
- DartCompletionRequest request,
- SuggestionBuilder builder,
- ) {
- return FieldFormalContributor(request, builder);
- }
+ TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class FieldFormalParameterTest2 extends AbstractCompletionDriverTest
+ with SuperFormalParameterTestCases {
+ @override
+ TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin SuperFormalParameterTestCases on AbstractCompletionDriverTest {
+ @override
+ bool get supportsAvailableSuggestions => true;
/// https://github.com/dart-lang/sdk/issues/39028
Future<void> test_mixin_constructor() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
mixin M {
var field = 0;
M(this.^);
}
''');
- var response = await computeSuggestions2();
check(response).suggestions.isEmpty;
}
Future<void> test_replacement_left() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
var field = 0;
A(this.f^);
}
''');
- var response = await computeSuggestions2();
check(response)
..hasReplacement(left: 1)
..suggestions.matchesInAnyOrder([
@@ -61,14 +64,13 @@
}
Future<void> test_replacement_right() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
var field = 0;
A(this.^f);
}
''');
- var response = await computeSuggestions2();
check(response)
..hasReplacement(right: 1)
..suggestions.matchesInAnyOrder([
@@ -80,7 +82,7 @@
}
Future<void> test_suggestions_onlyLocal() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
var inherited = 0;
}
@@ -94,7 +96,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -110,7 +111,7 @@
}
Future<void> test_suggestions_onlyNotSpecified_optionalNamed() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class Point {
final int x;
final int y;
@@ -118,7 +119,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -130,7 +130,7 @@
}
Future<void> test_suggestions_onlyNotSpecified_requiredPositional() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class Point {
final int x;
final int y;
@@ -138,7 +138,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
diff --git a/pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
similarity index 81%
rename from pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart
rename to pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
index 88d16b9..a38465a 100644
--- a/pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
@@ -2,34 +2,39 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analysis_server/src/services/completion/dart/super_formal_contributor.dart';
import 'package:analyzer_utilities/check/check.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'completion_check.dart';
-import 'completion_contributor_util.dart';
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
void main() {
defineReflectiveSuite(() {
- defineReflectiveTests(SuperFormalContributorTest);
+ defineReflectiveTests(SuperFormalParameterTest1);
+ defineReflectiveTests(SuperFormalParameterTest2);
});
}
@reflectiveTest
-class SuperFormalContributorTest extends DartCompletionContributorTest {
+class SuperFormalParameterTest1 extends AbstractCompletionDriverTest
+ with SuperFormalParameterTestCases {
@override
- DartCompletionContributor createContributor(
- DartCompletionRequest request,
- SuggestionBuilder builder,
- ) {
- return SuperFormalContributor(request, builder);
- }
+ TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class SuperFormalParameterTest2 extends AbstractCompletionDriverTest
+ with SuperFormalParameterTestCases {
+ @override
+ TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin SuperFormalParameterTestCases on AbstractCompletionDriverTest {
+ @override
+ bool get supportsAvailableSuggestions => true;
Future<void> test_explicit_optionalNamed_hasArgument_named() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -39,7 +44,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -51,7 +55,7 @@
}
Future<void> test_explicit_optionalNamed_hasArgument_positional() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -61,7 +65,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -78,7 +81,7 @@
/// It is an error, but the user already typed `super.`, so maybe do it.
Future<void> test_explicit_requiredPositional_hasArgument_positional() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(int first, double second);
}
@@ -88,7 +91,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -100,7 +102,7 @@
}
Future<void> test_explicitNamed_noOther() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A.named(int first, double second);
A(int third)
@@ -111,7 +113,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -123,7 +124,7 @@
}
Future<void> test_implicit_optionalNamed_hasNamed_notSuper() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -133,7 +134,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -149,7 +149,7 @@
}
Future<void> test_implicit_optionalNamed_hasNamed_notSuper2() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -159,7 +159,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -171,7 +170,7 @@
}
Future<void> test_implicit_optionalNamed_hasNamed_super() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -181,7 +180,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -193,7 +191,7 @@
}
Future<void> test_implicit_optionalNamed_hasNamed_super2() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -203,7 +201,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -215,7 +212,7 @@
}
Future<void> test_implicit_optionalNamed_hasPositional_notSuper() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -225,7 +222,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -241,7 +237,7 @@
}
Future<void> test_implicit_optionalNamed_hasPositional_super() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A({int first, double second});
}
@@ -251,7 +247,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -263,7 +258,7 @@
}
Future<void> test_implicit_optionalNamed_noOther() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(bool first, {int second, double third});
}
@@ -273,7 +268,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -289,7 +283,7 @@
}
Future<void> test_implicit_optionalPositional_hasPositional_notSuper() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A([int first, double second]);
}
@@ -299,7 +293,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -311,7 +304,7 @@
}
Future<void> test_implicit_optionalPositional_hasPositional_super() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A([int first, double second, bool third]);
}
@@ -321,7 +314,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -333,7 +325,7 @@
}
Future<void> test_implicit_optionalPositional_hasPositional_super2() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A([int first, double second, bool third]);
}
@@ -345,7 +337,6 @@
// It does not matter what is the name of the positional parameter.
// Here `super.second` consumes `int first`.
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -357,7 +348,7 @@
}
Future<void> test_implicit_optionalPositional_noOther() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A([int first, double second]);
}
@@ -367,7 +358,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -379,7 +369,7 @@
}
Future<void> test_implicit_requiredPositional_hasPositional_notSuper() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(int first, double second);
}
@@ -389,7 +379,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -401,7 +390,7 @@
}
Future<void> test_implicit_requiredPositional_hasPositional_super() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(int first, double second, bool third);
}
@@ -411,7 +400,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -423,7 +411,7 @@
}
Future<void> test_implicit_requiredPositional_hasPositional_super2() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(int first, double second, bool third);
}
@@ -435,7 +423,6 @@
// It does not matter what is the name of the positional parameter.
// Here `super.second` consumes `int first`.
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
@@ -447,7 +434,7 @@
}
Future<void> test_implicit_requiredPositional_noOther() async {
- addTestSource('''
+ var response = await getTestCodeSuggestions('''
class A {
A(int first, double second);
A.named(int third);
@@ -458,7 +445,6 @@
}
''');
- var response = await computeSuggestions2();
check(response)
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
diff --git a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
new file mode 100644
index 0000000..66dc07d
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'field_formal_parameter_test.dart' as field_formal_parameter;
+import 'super_formal_parameter_test.dart' as super_formal_parameter;
+
+/// Tests suggestions produced at specific locations.
+void main() {
+ defineReflectiveSuite(() {
+ field_formal_parameter.main();
+ super_formal_parameter.main();
+ });
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
index 018a020..ea4ec7e 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
@@ -32,14 +32,15 @@
mixin NamedArgumentTestCases on CompletionRelevanceTest {
@override
Future<void> setUp() async {
- await super.setUp();
-
var metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
- newDotPackagesFile(projectPath, content: '''
+ // TODO(scheglov) Use `writeTestPackageConfig` instead
+ newDotPackagesFile(testPackageRootPath, content: '''
meta:${metaLibFolder.toUri()}
-project:${toUri('$projectPath/lib')}
+project:${toUri(testPackageLibPath)}
''');
+
+ await super.setUp();
}
Future<void> test_required() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index 0ed0678..29e4a22 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -10,7 +10,6 @@
import 'completion_manager_test.dart' as completion_manager;
import 'declaration/test_all.dart' as declaration;
import 'extension_member_contributor_test.dart' as extension_member_contributor;
-import 'field_formal_contributor_test.dart' as field_formal_contributor_test;
import 'imported_reference_contributor_test.dart' as imported_ref_test;
import 'keyword_contributor_test.dart' as keyword_test;
import 'label_contributor_test.dart' as label_contributor_test;
@@ -18,11 +17,11 @@
import 'library_prefix_contributor_test.dart' as library_prefix_test;
import 'local_library_contributor_test.dart' as local_lib_test;
import 'local_reference_contributor_test.dart' as local_ref_test;
+import 'location/test_all.dart' as location;
import 'named_constructor_contributor_test.dart' as named_contributor_test;
import 'override_contributor_test.dart' as override_contributor_test;
import 'relevance/test_all.dart' as relevance_tests;
import 'static_member_contributor_test.dart' as static_contributor_test;
-import 'super_formal_contributor_test.dart' as super_formal_contributor;
import 'type_member_contributor_test.dart' as type_member_contributor_test;
import 'uri_contributor_test.dart' as uri_contributor_test;
import 'variable_name_contributor_test.dart' as variable_name_contributor_test;
@@ -35,7 +34,6 @@
completion_manager.main();
declaration.main();
extension_member_contributor.main();
- field_formal_contributor_test.main();
imported_ref_test.main();
keyword_test.main();
label_contributor_test.main();
@@ -43,11 +41,11 @@
library_prefix_test.main();
local_lib_test.main();
local_ref_test.main();
+ location.main();
named_contributor_test.main();
override_contributor_test.main();
relevance_tests.main();
static_contributor_test.main();
- super_formal_contributor.main();
type_member_contributor_test.main();
uri_contributor_test.main();
variable_name_contributor_test.main();
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 65409ce..a819b7f 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 3.3.0-dev
+* Added `getField` to `ExtensionElement`.
+
## 3.2.0
* Deprecated `changes` getter in `File` and `Folder`, use `watch()` instead.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 400e918..2ee4830 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1145,6 +1145,11 @@
/// Return a list containing all of the methods declared in this extension.
List<MethodElement> get methods;
+ /// Return the element representing the field with the given [name] that is
+ /// declared in this extension, or `null` if this extension does not declare a
+ /// field with the given name.
+ FieldElement? getField(String name);
+
/// Return the element representing the getter with the given [name] that is
/// declared in this extension, or `null` if this extension does not declare a
/// getter with the given name.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 165e57f..fe3cd92 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -82,7 +82,7 @@
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
class AnalysisDriver implements AnalysisDriverGeneric {
/// The version of data format, should be incremented on every format change.
- static const int DATA_VERSION = 201;
+ static const int DATA_VERSION = 204;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 347e551..62a49f0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -956,8 +956,16 @@
return true;
}
- // We have a contributor that looks at the type, but it is syntactic.
if (parent is FormalParameter && parent.identifier == node) {
+ // We use elements to access fields.
+ if (parent is FieldFormalParameter) {
+ return false;
+ }
+ // We use elements to access the enclosing constructor.
+ if (parent is SuperFormalParameter) {
+ return false;
+ }
+ // We have a contributor that looks at the type, but it is syntactic.
return true;
}
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 2e58795..77422fc 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -74,6 +74,8 @@
_write('enum ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
+ _writeTypesIfNotEmpty(' with ', element.mixins);
+ _writeTypesIfNotEmpty(' implements ', element.interfaces);
}
void writeExecutableElement(ExecutableElement element, String name) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index b79c1a0..df1d7da 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -48,6 +48,17 @@
abstract class AbstractClassElementImpl extends _ExistingElementImpl
with TypeParameterizedElementMixin
implements ClassElement {
+ /// The superclass of the class, or `null` for [Object].
+ InterfaceType? _supertype;
+
+ /// A list containing all of the mixins that are applied to the class being
+ /// extended in order to derive the superclass of this class.
+ List<InterfaceType> _mixins = const [];
+
+ /// A list containing all of the interfaces that are implemented by this
+ /// class.
+ List<InterfaceType> _interfaces = const [];
+
/// The type defined by the class.
InterfaceType? _thisType;
@@ -61,6 +72,10 @@
/// A list containing all of the methods contained in this class.
List<MethodElement> _methods = _Sentinel.methodElement;
+ /// This callback is set during mixins inference to handle reentrant calls.
+ List<InterfaceType>? Function(AbstractClassElementImpl)?
+ mixinInferenceCallback;
+
/// Initialize a newly created class element to have the given [name] at the
/// given [offset] in the file that contains the declaration of this element.
AbstractClassElementImpl(String name, int offset) : super(name, offset);
@@ -75,6 +90,12 @@
}
@override
+ List<InterfaceType> get allSupertypes {
+ var sessionImpl = library.session as AnalysisSessionImpl;
+ return sessionImpl.classHierarchy.implementedInterfaces(this);
+ }
+
+ @override
String get displayName => name;
@override
@@ -92,6 +113,18 @@
}
@override
+ List<InterfaceType> get interfaces =>
+ ElementTypeProvider.current.getClassInterfaces(this);
+
+ set interfaces(List<InterfaceType> interfaces) {
+ _interfaces = interfaces;
+ }
+
+ List<InterfaceType> get interfacesInternal {
+ return _interfaces;
+ }
+
+ @override
bool get isDartCoreObject => false;
@override
@@ -101,9 +134,40 @@
bool get isMixin => false;
@override
+ List<InterfaceType> get mixins {
+ if (mixinInferenceCallback != null) {
+ var mixins = mixinInferenceCallback!(this);
+ if (mixins != null) {
+ return _mixins = mixins;
+ }
+ }
+
+ return _mixins;
+ }
+
+ set mixins(List<InterfaceType> mixins) {
+ _mixins = mixins;
+ }
+
+ @override
List<InterfaceType> get superclassConstraints => const <InterfaceType>[];
@override
+ InterfaceType? get supertype {
+ if (_supertype != null) return _supertype!;
+
+ if (hasModifier(Modifier.DART_CORE_OBJECT)) {
+ return null;
+ }
+
+ return _supertype;
+ }
+
+ set supertype(InterfaceType? supertype) {
+ _supertype = supertype;
+ }
+
+ @override
InterfaceType get thisType {
if (_thisType == null) {
List<DartType> typeArguments;
@@ -444,17 +508,6 @@
/// An [AbstractClassElementImpl] which is a class.
class ClassElementImpl extends AbstractClassElementImpl {
- /// The superclass of the class, or `null` for [Object].
- InterfaceType? _supertype;
-
- /// A list containing all of the mixins that are applied to the class being
- /// extended in order to derive the superclass of this class.
- List<InterfaceType> _mixins = const [];
-
- /// A list containing all of the interfaces that are implemented by this
- /// class.
- List<InterfaceType> _interfaces = const [];
-
/// For classes which are not mixin applications, a list containing all of the
/// constructors contained in this class, or `null` if the list of
/// constructors has not yet been built.
@@ -468,9 +521,6 @@
/// of this class have been inferred.
bool hasBeenInferred = false;
- /// This callback is set during mixins inference to handle reentrant calls.
- List<InterfaceType>? Function(ClassElementImpl)? mixinInferenceCallback;
-
ElementLinkedData? linkedData;
/// Initialize a newly created class element to have the given [name] at the
@@ -493,12 +543,6 @@
}
@override
- List<InterfaceType> get allSupertypes {
- var sessionImpl = library.session as AnalysisSessionImpl;
- return sessionImpl.classHierarchy.implementedInterfaces(this);
- }
-
- @override
List<ConstructorElement> get constructors {
if (!identical(_constructors, _Sentinel.constructorElement)) {
return _constructors;
@@ -611,13 +655,6 @@
}
@override
- List<InterfaceType> get interfaces =>
- ElementTypeProvider.current.getClassInterfaces(this);
-
- set interfaces(List<InterfaceType> interfaces) {
- _interfaces = interfaces;
- }
-
List<InterfaceType> get interfacesInternal {
linkedData?.read(this);
return _interfaces;
@@ -740,19 +777,8 @@
@override
List<InterfaceType> get mixins {
- if (mixinInferenceCallback != null) {
- var mixins = mixinInferenceCallback!(this);
- if (mixins != null) {
- return _mixins = mixins;
- }
- }
-
linkedData?.read(this);
- return _mixins;
- }
-
- set mixins(List<InterfaceType> mixins) {
- _mixins = mixins;
+ return super.mixins;
}
@override
@@ -768,17 +794,7 @@
@override
InterfaceType? get supertype {
linkedData?.read(this);
- if (_supertype != null) return _supertype!;
-
- if (hasModifier(Modifier.DART_CORE_OBJECT)) {
- return null;
- }
-
- return _supertype;
- }
-
- set supertype(InterfaceType? supertype) {
- _supertype = supertype;
+ return super.supertype;
}
@override
@@ -2675,10 +2691,6 @@
return _accessors;
}
- @override
- List<InterfaceType> get allSupertypes =>
- <InterfaceType>[...interfaces, supertype];
-
List<FieldElement> get constants {
return fields.where((field) => field.isEnumConstant).toList();
}
@@ -2707,9 +2719,6 @@
bool get hasStaticMember => true;
@override
- List<InterfaceType> get interfaces => const [];
-
- @override
bool get isAbstract => false;
@override
@@ -2753,17 +2762,14 @@
}
@override
- List<InterfaceType> get mixins => const <InterfaceType>[];
-
- @override
String get name {
return super.name!;
}
@override
- InterfaceType get supertype {
- var enumType = library.typeProvider.enumType;
- return enumType ?? library.typeProvider.objectType;
+ InterfaceType? get supertype {
+ linkedData?.read(this);
+ return super.supertype;
}
@override
@@ -3128,6 +3134,16 @@
}
@override
+ FieldElement? getField(String name) {
+ for (FieldElement fieldElement in fields) {
+ if (name == fieldElement.name) {
+ return fieldElement;
+ }
+ }
+ return null;
+ }
+
+ @override
PropertyAccessorElement? getGetter(String getterName) {
int length = accessors.length;
for (int i = 0; i < length; i++) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 192c94c..578cfdf 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -12,15 +12,19 @@
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/instance_creation_resolver_helper.dart';
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/resolver.dart';
-class AnnotationResolver {
+class AnnotationResolver with InstanceCreationResolverMixin {
final ResolverVisitor _resolver;
AnnotationResolver(this._resolver);
+ @override
+ ResolverVisitor get resolver => _resolver;
+
LibraryElement get _definingLibrary => _resolver.definingLibrary;
ErrorReporter get _errorReporter => _resolver.errorReporter;
@@ -213,13 +217,21 @@
return;
}
- _resolver.visitArgumentList(argumentList,
- whyNotPromotedList: whyNotPromotedList);
-
var elementToInfer = ConstructorElementToInfer(
typeParameters,
constructorElement,
);
+ inferArgumentTypes(
+ inferenceNode: node,
+ constructorElement: constructorElement,
+ elementToInfer: elementToInfer,
+ typeArguments: node.typeArguments,
+ arguments: node.arguments!,
+ errorNode: node,
+ isConst: true);
+ _resolver.visitArgumentList(argumentList,
+ whyNotPromotedList: whyNotPromotedList);
+
var constructorRawType = elementToInfer.asType;
var inferred = _resolver.inferenceHelper.inferGenericInvoke(
diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
index 625037b..2ff2199 100644
--- a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
@@ -3,9 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/resolver/instance_creation_resolver_helper.dart';
import 'package:analyzer/src/generated/resolver.dart';
/// A resolver for [InstanceCreationExpression] nodes.
@@ -14,12 +13,15 @@
/// [InstanceCreationExpression] as a [MethodInvocation] if the parsed
/// [ConstructorName]'s `type` resolves to a [FunctionReference] or
/// [ConstructorReference], instead of a [NamedType].
-class InstanceCreationExpressionResolver {
+class InstanceCreationExpressionResolver with InstanceCreationResolverMixin {
/// The resolver driving this participant.
final ResolverVisitor _resolver;
InstanceCreationExpressionResolver(this._resolver);
+ @override
+ ResolverVisitor get resolver => _resolver;
+
void resolve(InstanceCreationExpressionImpl node) {
// The parser can parse certain code as [InstanceCreationExpression] when it
// might be an invocation of a method on a [FunctionReference] or
@@ -48,76 +50,29 @@
_resolveInstanceCreationExpression(node);
}
- void _inferArgumentTypes(covariant InstanceCreationExpressionImpl node) {
+ void _resolveInstanceCreationExpression(InstanceCreationExpressionImpl node) {
+ var whyNotPromotedList = <WhyNotPromotedGetter>[];
var constructorName = node.constructorName;
- var typeName = constructorName.type2;
- var typeArguments = typeName.typeArguments;
+ constructorName.accept(_resolver);
+ // Re-assign constructorName in case the node got replaced.
+ constructorName = node.constructorName;
var elementToInfer = _resolver.inferenceHelper.constructorElementToInfer(
constructorName: constructorName,
definingLibrary: _resolver.definingLibrary,
);
- FunctionType? inferred;
-
- // If the constructor is generic, we'll have a ConstructorMember that
- // substitutes in type arguments (possibly `dynamic`) from earlier in
- // resolution.
- //
- // Otherwise we'll have a ConstructorElement, and we can skip inference
- // because there's nothing to infer in a non-generic type.
- if (elementToInfer != null) {
- // TODO(leafp): Currently, we may re-infer types here, since we
- // sometimes resolve multiple times. We should really check that we
- // have not already inferred something. However, the obvious ways to
- // check this don't work, since we may have been instantiated
- // to bounds in an earlier phase, and we *do* want to do inference
- // in that case.
-
- // Get back to the uninstantiated generic constructor.
- // TODO(jmesserly): should we store this earlier in resolution?
- // Or look it up, instead of jumping backwards through the Member?
- var rawElement = elementToInfer.element;
- var constructorType = elementToInfer.asType;
-
- inferred = _resolver.inferenceHelper.inferArgumentTypesForGeneric(
- node, constructorType, typeArguments,
- isConst: node.isConst, errorNode: node.constructorName);
-
- if (inferred != null) {
- var arguments = node.argumentList;
- InferenceContext.setType(arguments, inferred);
- // Fix up the parameter elements based on inferred method.
- arguments.correspondingStaticParameters =
- ResolverVisitor.resolveArgumentsToParameters(
- argumentList: arguments,
- parameters: inferred.parameters,
- );
-
- constructorName.type2.type = inferred.returnType;
-
- // Update the static element as well. This is used in some cases, such
- // as computing constant values. It is stored in two places.
- var constructorElement = ConstructorMember.from(
- rawElement,
- inferred.returnType as InterfaceType,
- );
- constructorName.staticElement = constructorElement;
- }
+ var typeName = constructorName.type2;
+ var inferenceResult = inferArgumentTypes(
+ inferenceNode: node,
+ constructorElement: constructorName.staticElement,
+ elementToInfer: elementToInfer,
+ typeArguments: typeName.typeArguments,
+ arguments: node.argumentList,
+ errorNode: constructorName,
+ isConst: node.isConst);
+ if (inferenceResult != null) {
+ typeName.type = inferenceResult.constructedType;
+ constructorName.staticElement = inferenceResult.constructorElement;
}
-
- if (inferred == null) {
- var constructorElement = constructorName.staticElement;
- if (constructorElement != null) {
- var type = constructorElement.type;
- type = _resolver.toLegacyTypeIfOptOut(type) as FunctionType;
- InferenceContext.setType(node.argumentList, type);
- }
- }
- }
-
- void _resolveInstanceCreationExpression(InstanceCreationExpressionImpl node) {
- var whyNotPromotedList = <WhyNotPromotedGetter>[];
- node.constructorName.accept(_resolver);
- _inferArgumentTypes(node);
_resolver.visitArgumentList(node.argumentList,
whyNotPromotedList: whyNotPromotedList);
_resolver.elementResolver.visitInstanceCreationExpression(node);
diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart
new file mode 100644
index 0000000..9177b2b
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// Data constructor containing information about the result of performing type
+/// inference on an instance creation (either an InstanceCreationExpression or
+/// an Annotation that refers to a constructor).
+class InstanceCreationInferenceResult {
+ /// The refined constructor element (after type inference)
+ final ConstructorElement constructorElement;
+
+ /// The type that was constructed (after type inference)
+ final DartType constructedType;
+
+ InstanceCreationInferenceResult(
+ {required this.constructorElement, required this.constructedType});
+}
+
+/// Mixin containing shared functionality for resolving AST nodes that may
+/// create instances (InstanceCreationExpression and Annotation).
+mixin InstanceCreationResolverMixin {
+ ResolverVisitor get resolver;
+
+ /// Performs the first step of type inference for a constructor invocation.
+ InstanceCreationInferenceResult? inferArgumentTypes(
+ {required AstNode inferenceNode,
+ required ConstructorElement? constructorElement,
+ required ConstructorElementToInfer? elementToInfer,
+ required TypeArgumentListImpl? typeArguments,
+ required ArgumentListImpl arguments,
+ required AstNode errorNode,
+ required bool isConst}) {
+ InstanceCreationInferenceResult? inferenceResult;
+ FunctionType? inferred;
+
+ // If the constructor is generic, we'll have a ConstructorMember that
+ // substitutes in type arguments (possibly `dynamic`) from earlier in
+ // resolution.
+ //
+ // Otherwise we'll have a ConstructorElement, and we can skip inference
+ // because there's nothing to infer in a non-generic type.
+ if (elementToInfer != null) {
+ // TODO(leafp): Currently, we may re-infer types here, since we
+ // sometimes resolve multiple times. We should really check that we
+ // have not already inferred something. However, the obvious ways to
+ // check this don't work, since we may have been instantiated
+ // to bounds in an earlier phase, and we *do* want to do inference
+ // in that case.
+
+ // Get back to the uninstantiated generic constructor.
+ // TODO(jmesserly): should we store this earlier in resolution?
+ // Or look it up, instead of jumping backwards through the Member?
+ var rawElement = elementToInfer.element;
+ var constructorType = elementToInfer.asType;
+
+ inferred = resolver.inferenceHelper.inferArgumentTypesForGeneric(
+ inferenceNode, constructorType, typeArguments,
+ isConst: isConst, errorNode: errorNode);
+
+ if (inferred != null) {
+ InferenceContext.setType(arguments, inferred);
+ // Fix up the parameter elements based on inferred method.
+ arguments.correspondingStaticParameters =
+ ResolverVisitor.resolveArgumentsToParameters(
+ argumentList: arguments,
+ parameters: inferred.parameters,
+ );
+
+ // Update the static element as well. This is used in some cases, such
+ // as computing constant values. It is stored in two places.
+ constructorElement = ConstructorMember.from(
+ rawElement,
+ inferred.returnType as InterfaceType,
+ );
+ inferenceResult = InstanceCreationInferenceResult(
+ constructorElement: constructorElement,
+ constructedType: inferred.returnType);
+ }
+ }
+
+ if (inferred == null) {
+ if (constructorElement != null) {
+ var type = constructorElement.type;
+ type = resolver.toLegacyTypeIfOptOut(type) as FunctionType;
+ InferenceContext.setType(arguments, type);
+ }
+ }
+
+ return inferenceResult;
+ }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index 4a1e23d..65abd1c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -50,7 +50,11 @@
}
DartType type = DynamicTypeImpl.instance;
- if (element is ClassElement) {
+ if (result.readElementRequested == null &&
+ result.readElementRecovery != null) {
+ // Since the element came from error recovery logic, its type isn't
+ // trustworthy; leave it as `dynamic`.
+ } else if (element is ClassElement) {
if (_isExpressionIdentifier(node)) {
var type = _typeProvider.typeType;
node.staticType = type;
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index d0f35da..8e8bce1 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -253,17 +253,20 @@
}
/// If the [element] is not static, report the error on the [identifier].
- void _checkForStaticAccessToInstanceMember(
+ ///
+ /// Returns `true` if an error was reported.
+ bool _checkForStaticAccessToInstanceMember(
SimpleIdentifier identifier,
ExecutableElement element,
) {
- if (element.isStatic) return;
+ if (element.isStatic) return false;
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
identifier,
[identifier.name],
);
+ return true;
}
void _checkForStaticMember(
@@ -494,6 +497,7 @@
}
ExecutableElement? readElement;
+ ExecutableElement? readElementRecovery;
if (hasRead) {
readElement = typeReference.getGetter(propertyName.name);
if (readElement != null && !_isAccessible(readElement)) {
@@ -509,7 +513,10 @@
if (readElement != null) {
readElement = _resolver.toLegacyElement(readElement);
- _checkForStaticAccessToInstanceMember(propertyName, readElement);
+ if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
+ readElementRecovery = readElement;
+ readElement = null;
+ }
} else {
var code = typeReference.isEnum
? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
@@ -535,7 +542,10 @@
[propertyName.name],
);
}
- _checkForStaticAccessToInstanceMember(propertyName, writeElement);
+ if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
+ writeElementRecovery = writeElement;
+ writeElement = null;
+ }
} else {
// Recovery, try to use getter.
writeElementRecovery = typeReference.getGetter(propertyName.name);
@@ -550,6 +560,7 @@
return PropertyElementResolverResult(
readElementRequested: readElement,
+ readElementRecovery: readElementRecovery,
writeElementRequested: writeElement,
writeElementRecovery: writeElementRecovery,
);
@@ -564,6 +575,7 @@
var memberName = propertyName.name;
ExecutableElement? readElement;
+ ExecutableElement? readElementRecovery;
if (hasRead) {
readElement ??= extension.getGetter(memberName);
readElement ??= extension.getMethod(memberName);
@@ -579,11 +591,15 @@
);
} else {
readElement = _resolver.toLegacyElement(readElement);
- _checkForStaticAccessToInstanceMember(propertyName, readElement);
+ if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
+ readElementRecovery = readElement;
+ readElement = null;
+ }
}
}
ExecutableElement? writeElement;
+ ExecutableElement? writeElementRecovery;
if (hasWrite) {
writeElement = extension.getSetter(memberName);
@@ -598,13 +614,18 @@
);
} else {
writeElement = _resolver.toLegacyElement(writeElement);
- _checkForStaticAccessToInstanceMember(propertyName, writeElement);
+ if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
+ writeElementRecovery = writeElement;
+ writeElement = null;
+ }
}
}
return PropertyElementResolverResult(
readElementRequested: readElement,
+ readElementRecovery: readElementRecovery,
writeElementRequested: writeElement,
+ writeElementRecovery: writeElementRecovery,
);
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 7145bd0..d41a3b6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -409,6 +409,7 @@
void visitEnumDeclaration(covariant EnumDeclarationImpl node) {
EnumElementImpl element = _elementWalker!.getEnum();
node.name.staticElement = element;
+ _namedTypeResolver.enclosingClass = element;
node.metadata.accept(this);
_setElementAnnotations(node.metadata, element.metadata);
@@ -418,12 +419,17 @@
_buildTypeParameterElements(node.typeParameters);
node.typeParameters?.accept(this);
+ _resolveWithClause(node.withClause);
+ _resolveImplementsClause(node.implementsClause);
+
_defineElements(element.accessors);
_defineElements(element.methods);
node.constants.accept(this);
node.members.accept(this);
});
});
+
+ _namedTypeResolver.enclosingClass = null;
}
@override
diff --git a/pkg/analyzer/lib/src/generated/element_type_provider.dart b/pkg/analyzer/lib/src/generated/element_type_provider.dart
index ba2554c..c089385 100644
--- a/pkg/analyzer/lib/src/generated/element_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/element_type_provider.dart
@@ -32,7 +32,7 @@
void freshTypeParameterCreated(TypeParameterElement newTypeParameter,
TypeParameterElement oldTypeParameter) {}
- List<InterfaceType> getClassInterfaces(ClassElementImpl element) =>
+ List<InterfaceType> getClassInterfaces(AbstractClassElementImpl element) =>
element.interfacesInternal;
/// Queries the parameters of an executable element's signature.
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 53915eb..6400c29 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -276,6 +276,9 @@
unitElement: element.enclosingElement,
);
_readTypeParameters(reader, element.typeParameters);
+ element.supertype = reader._readOptionalInterfaceType();
+ element.mixins = reader._readInterfaceTypeList();
+ element.interfaces = reader._readInterfaceTypeList();
applyConstantOffsets?.perform();
}
}
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 489d45d..6cc91be 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -176,6 +176,10 @@
_resolutionSink._writeAnnotationList(element.metadata);
_writeTypeParameters(element.typeParameters, () {
+ _resolutionSink.writeType(element.supertype);
+ _resolutionSink._writeTypeList(element.mixins);
+ _resolutionSink._writeTypeList(element.interfaces);
+
_writeList(
element.fields.where((e) {
return !e.isSynthetic ||
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 667c275..971a7f1 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -339,10 +339,8 @@
holder.addNonSyntheticField(valuesField);
}
- // TODO(scheglov) implement
- // node.extendsClause?.accept(this);
- // node.withClause?.accept(this);
- // node.implementsClause?.accept(this);
+ node.withClause?.accept(this);
+ node.implementsClause?.accept(this);
// Build the 'index' field.
var indexField = ConstFieldElementImpl('index', -1)
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index aa57e1e..e6caec3 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -134,6 +134,8 @@
void buildEnumChildren() {
var typeProvider = element.typeProvider;
for (var enum_ in implicitEnumNodes) {
+ enum_.element.supertype =
+ typeProvider.enumType ?? typeProvider.objectType;
enum_.indexField.type = typeProvider.intType;
var valuesType = typeProvider.listType(
element.typeSystem.instantiateToBounds2(
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index dd5b4cc..57e276a 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -122,10 +122,8 @@
scope = TypeParameterScope(scope, element.typeParameters);
node.typeParameters?.accept(this);
- // TODO(scheglov) implement
- // node.extendsClause?.accept(this);
- // node.implementsClause?.accept(this);
- // node.withClause?.accept(this);
+ node.implementsClause?.accept(this);
+ node.withClause?.accept(this);
scope = ClassScope(scope, element);
LinkingNodeContext(node, scope);
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 795d229..03daeed 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -223,7 +223,15 @@
}
void _enumDeclaration(EnumDeclaration node) {
- // TODO(scheglov) implement
+ var element = node.declaredElement as EnumElementImpl;
+
+ element.mixins = _toInterfaceTypeList(
+ node.withClause?.mixinTypes2,
+ );
+
+ element.interfaces = _toInterfaceTypeList(
+ node.implementsClause?.interfaces2,
+ );
}
void _extensionDeclaration(ExtensionDeclaration node) {
@@ -362,7 +370,7 @@
/// Performs mixins inference in a [ClassDeclaration].
class _MixinInference {
- final ClassElementImpl element;
+ final AbstractClassElementImpl element;
final TypeSystemImpl typeSystem;
final FeatureSet featureSet;
final InterfaceType classType;
@@ -512,14 +520,15 @@
/// we are inferring the [element] now, i.e. there is a loop.
///
/// This is an error. So, we return the empty list, and break the loop.
- List<InterfaceType> _callbackWhenLoop(ClassElementImpl element) {
+ List<InterfaceType> _callbackWhenLoop(AbstractClassElementImpl element) {
element.mixinInferenceCallback = null;
return <InterfaceType>[];
}
/// This method is invoked when mixins are asked from the [element], and
/// we are not inferring the [element] now, i.e. there is no loop.
- List<InterfaceType>? _callbackWhenRecursion(ClassElementImpl element) {
+ List<InterfaceType>? _callbackWhenRecursion(
+ AbstractClassElementImpl element) {
var node = _linker.getLinkingNode(element);
if (node != null) {
_inferDeclaration(node);
@@ -528,7 +537,7 @@
return null;
}
- void _infer(ClassElementImpl element, WithClause? withClause) {
+ void _infer(AbstractClassElementImpl element, WithClause? withClause) {
if (withClause != null) {
element.mixinInferenceCallback = _callbackWhenLoop;
try {
@@ -550,6 +559,9 @@
} else if (node is ClassTypeAlias) {
var element = node.declaredElement as ClassElementImpl;
_infer(element, node.withClause);
+ } else if (node is EnumDeclaration) {
+ var element = node.declaredElement as EnumElementImpl;
+ _infer(element, node.withClause);
}
}
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 7159665..4a4b593 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -5,6 +5,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
+import 'package:collection/src/iterable_extensions.dart';
/// Helper for finding elements declared in the resolved [unit].
class FindElement extends _FindElementBase {
@@ -406,147 +407,27 @@
}
FieldElement field(String name, {String? of}) {
- FieldElement? result;
-
- void findIn(List<FieldElement> fields) {
- for (var field in fields) {
- if (field.name == name) {
- if (result != null) {
- throw StateError('Not unique: $name');
- }
- result = field;
- }
- }
- }
-
- for (var enum_ in unitElement.enums) {
- if (of != null && enum_.name != of) {
- continue;
- }
- findIn(enum_.fields);
- }
-
- for (var class_ in unitElement.classes) {
- if (of != null && class_.name != of) {
- continue;
- }
- findIn(class_.fields);
- }
-
- for (var mixin in unitElement.mixins) {
- if (of != null && mixin.name != of) {
- continue;
- }
- findIn(mixin.fields);
- }
-
- for (var extension in unitElement.extensions) {
- if (of != null && extension.name != of) {
- continue;
- }
- findIn(extension.fields);
- }
-
- if (result != null) {
- return result!;
- }
- throw StateError('Not found: $name');
+ return _findInClassesLike(
+ className: of,
+ fromClass: (element) => element.getField(name),
+ fromExtension: (element) => element.getField(name),
+ );
}
PropertyAccessorElement getter(String name, {String? of}) {
- PropertyAccessorElement? result;
-
- void findIn(List<PropertyAccessorElement> accessors) {
- for (var accessor in accessors) {
- if (accessor.isGetter && accessor.displayName == name) {
- if (result != null) {
- throw StateError('Not unique: $name');
- }
- result = accessor;
- }
- }
- }
-
- for (var enum_ in unitElement.enums) {
- if (of != null && enum_.name != of) {
- continue;
- }
- findIn(enum_.accessors);
- }
-
- for (var extension_ in unitElement.extensions) {
- if (of != null && extension_.name != of) {
- continue;
- }
- findIn(extension_.accessors);
- }
-
- for (var class_ in unitElement.classes) {
- if (of != null && class_.name != of) {
- continue;
- }
- findIn(class_.accessors);
- }
-
- for (var mixin in unitElement.mixins) {
- if (of != null && mixin.name != of) {
- continue;
- }
- findIn(mixin.accessors);
- }
-
- if (result != null) {
- return result!;
- }
- throw StateError('Not found: $name');
+ return _findInClassesLike(
+ className: of,
+ fromClass: (element) => element.getGetter(name),
+ fromExtension: (element) => element.getGetter(name),
+ );
}
MethodElement method(String name, {String? of}) {
- MethodElement? result;
-
- void findIn(List<MethodElement> methods) {
- for (var method in methods) {
- if (method.name == name) {
- if (result != null) {
- throw StateError('Not unique: $name');
- }
- result = method;
- }
- }
- }
-
- for (var class_ in unitElement.classes) {
- if (of != null && class_.name != of) {
- continue;
- }
- findIn(class_.methods);
- }
-
- for (var enum_ in unitElement.enums) {
- if (of != null && enum_.name != of) {
- continue;
- }
- findIn(enum_.methods);
- }
-
- for (var extension_ in unitElement.extensions) {
- if (of != null && extension_.name != of) {
- continue;
- }
- findIn(extension_.methods);
- }
-
- for (var mixin in unitElement.mixins) {
- if (of != null && mixin.name != of) {
- continue;
- }
- findIn(mixin.methods);
- }
-
- if (result != null) {
- return result!;
- }
- throw StateError('Not found: $name');
+ return _findInClassesLike(
+ className: of,
+ fromClass: (element) => element.getMethod(name),
+ fromExtension: (element) => element.getMethod(name),
+ );
}
ClassElement mixin(String name) {
@@ -581,44 +462,11 @@
}
PropertyAccessorElement setter(String name, {String? of}) {
- PropertyAccessorElement? result;
-
- void findIn(List<PropertyAccessorElement> accessors) {
- for (var accessor in accessors) {
- if (accessor.isSetter && accessor.displayName == name) {
- if (result != null) {
- throw StateError('Not unique: $name');
- }
- result = accessor;
- }
- }
- }
-
- for (var extension_ in unitElement.extensions) {
- if (of != null && extension_.name != of) {
- continue;
- }
- findIn(extension_.accessors);
- }
-
- for (var class_ in unitElement.classes) {
- if (of != null && class_.name != of) {
- continue;
- }
- findIn(class_.accessors);
- }
-
- for (var mixin in unitElement.mixins) {
- if (of != null && mixin.name != of) {
- continue;
- }
- findIn(mixin.accessors);
- }
-
- if (result != null) {
- return result!;
- }
- throw StateError('Not found: $name');
+ return _findInClassesLike(
+ className: of,
+ fromClass: (element) => element.getSetter(name),
+ fromExtension: (element) => element.getSetter(name),
+ );
}
FunctionElement topFunction(String name) {
@@ -659,6 +507,38 @@
ConstructorElement unnamedConstructor(String name) {
return class_(name).unnamedConstructor!;
}
+
+ T _findInClassesLike<T extends Element>({
+ required String? className,
+ required T? Function(ClassElement element) fromClass,
+ required T? Function(ExtensionElement element) fromExtension,
+ }) {
+ bool filter(Element element) {
+ return className == null || element.name == className;
+ }
+
+ var classes = [
+ ...unitElement.classes,
+ ...unitElement.enums,
+ ...unitElement.mixins,
+ ];
+
+ var results = [
+ ...classes.where(filter).map(fromClass),
+ ...unitElement.extensions.where(filter).map(fromExtension),
+ ].whereNotNull().toList();
+
+ var result = results.singleOrNull;
+ if (result != null) {
+ return result;
+ }
+
+ if (results.isEmpty) {
+ throw StateError('Not found');
+ } else {
+ throw StateError('Not unique');
+ }
+ }
}
extension ExecutableElementExtensions on ExecutableElement {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5994057..424d0ce 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
name: analyzer
-version: 3.2.0
+version: 3.3.0-dev
description: This package provides a library that performs static analysis of Dart code.
homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
diff --git a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
index e241371..c8395fc 100644
--- a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
@@ -152,6 +152,19 @@
]);
}
+ test_constructorDeclaration_fieldFormalParameter_name() async {
+ var result = _resolveTestCode(r'''
+class A {
+ final int f;
+ A(this.^);
+}
+''');
+
+ result.assertResolvedNodes([
+ 'A(this.);',
+ ]);
+ }
+
test_constructorDeclaration_fieldInitializer_name() async {
var result = _resolveTestCode(r'''
class A {}
@@ -201,6 +214,23 @@
result.assertResolvedNodes([]);
}
+ test_constructorDeclaration_superFormalParameter_name() async {
+ var result = _resolveTestCode(r'''
+class A {
+ A(int first, double second);
+ A.named(int third);
+}
+
+class B extends A {
+ B(super.^);
+}
+''');
+
+ result.assertResolvedNodes([
+ 'B(super.);',
+ ]);
+ }
+
test_doubleLiteral() async {
var result = _resolveTestCode(r'''
var v = 1.2^;
diff --git a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
index ccb6a78..5514beb 100644
--- a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
+++ b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
@@ -4,6 +4,7 @@
import 'dart:collection';
+import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/constant/value.dart';
/// Prints [DartObjectImpl] as a tree, with values and fields.
@@ -24,6 +25,17 @@
} else if (type.isDartCoreString) {
sink.write('String ');
sink.writeln(object.toStringValue());
+ } else if (type.isDartCoreList) {
+ var newIndent = '$indent ';
+ sink.writeln('List');
+ sink.write(newIndent);
+ sink.writeln(
+ 'elementType: ${(type as InterfaceType).typeArguments[0]}');
+ var elements = object.toListValue()!;
+ for (int i = 0; i < elements.length; i++) {
+ sink.write(newIndent);
+ write(elements[i] as DartObjectImpl, newIndent);
+ }
} else if (object.isUserDefinedObject) {
var newIndent = '$indent ';
var typeStr = type.getDisplayString(withNullability: true);
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index 43cf553..3381a96 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -232,6 +233,26 @@
);
}
+ test_getter() async {
+ await assertNoErrorsInCode(r'''
+enum E<T> {
+ v;
+ T get foo => throw 0;
+}
+''');
+
+ assertElement(
+ findNode.methodDeclaration('get foo'),
+ findElement.getter('foo', of: 'E'),
+ );
+
+ assertNamedType(
+ findNode.namedType('T get'),
+ findElement.typeParameter('T'),
+ 'T',
+ );
+ }
+
test_inference_listLiteral() async {
await assertNoErrorsInCode(r'''
enum E1 {a, b}
@@ -244,6 +265,21 @@
assertType(v.type, 'List<Enum>');
}
+ test_interfaces() async {
+ await assertNoErrorsInCode(r'''
+class I {}
+enum E implements I { // ref
+ v;
+}
+''');
+
+ assertNamedType(
+ findNode.namedType('I { // ref'),
+ findElement.class_('I'),
+ 'I',
+ );
+ }
+
test_isEnumConstant() async {
await assertNoErrorsInCode(r'''
enum E {
@@ -303,6 +339,68 @@
);
}
+ test_mixins() async {
+ await assertNoErrorsInCode(r'''
+mixin M {}
+enum E with M { // ref
+ v;
+}
+''');
+
+ assertNamedType(
+ findNode.namedType('M { // ref'),
+ findElement.mixin('M'),
+ 'M',
+ );
+ }
+
+ test_mixins_inference() async {
+ await assertNoErrorsInCode(r'''
+mixin M1<T> {}
+mixin M2<T> on M1<T> {}
+enum E with M1<int>, M2 {
+ v;
+}
+''');
+
+ assertNamedType(
+ findNode.namedType('M1<int>'),
+ findElement.mixin('M1'),
+ 'M1<int>',
+ );
+
+ assertNamedType(
+ findNode.namedType('M2 {'),
+ findElement.mixin('M2'),
+ 'M2<int>',
+ );
+ }
+
+ test_setter() async {
+ await assertNoErrorsInCode(r'''
+enum E<T> {
+ v;
+ set foo(T a) {}
+}
+''');
+
+ assertElement(
+ findNode.methodDeclaration('set foo'),
+ findElement.setter('foo'),
+ );
+
+ assertElement(
+ findNode.simpleFormalParameter('a) {}'),
+ findElement.setter('foo').parameter('a'),
+ );
+
+ assertNamedType(
+ findNode.namedType('T a'),
+ findElement.typeParameter('T'),
+ 'T',
+ );
+ }
+
test_value_underscore() async {
await assertNoErrorsInCode(r'''
enum E { _ }
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 2cd36d7..a053e01 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -559,6 +559,104 @@
);
}
+ test_value_genericClass_downwards_inference_namedConstructor() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {
+ final List<List<T>> f;
+ const A.named(this.f);
+}
+
+@A.named([])
+void f() {}
+''');
+
+ var annotation = findNode.annotation('@A');
+ _assertResolvedNodeText(annotation, r'''
+Annotation
+ arguments: ArgumentList
+ arguments
+ ListLiteral
+ leftBracket: [
+ rightBracket: ]
+ staticType: List<List<Object?>>
+ leftParenthesis: (
+ rightParenthesis: )
+ atSign: @
+ element: ConstructorMember
+ base: self::@class::A::@constructor::named
+ substitution: {T: Object?}
+ name: PrefixedIdentifier
+ identifier: SimpleIdentifier
+ staticElement: ConstructorMember
+ base: self::@class::A::@constructor::named
+ substitution: {T: Object?}
+ staticType: null
+ token: named
+ period: .
+ prefix: SimpleIdentifier
+ staticElement: self::@class::A
+ staticType: null
+ token: A
+ staticElement: ConstructorMember
+ base: self::@class::A::@constructor::named
+ substitution: {T: Object?}
+ staticType: null
+''');
+ _assertAnnotationValueText(annotation, '''
+A<Object?>
+ f: List
+ elementType: List<Object?>
+''');
+ assertElement2(
+ findNode.listLiteral('[]').staticParameterElement,
+ declaration: findElement.fieldFormalParameter('f'),
+ substitution: {'T': 'Object?'},
+ );
+ }
+
+ test_value_genericClass_downwards_inference_unnamedConstructor() async {
+ await assertNoErrorsInCode(r'''
+ class A<T> {
+ final List<List<T>> f;
+ const A(this.f);
+}
+
+@A([])
+void f() {}
+''');
+
+ var annotation = findNode.annotation('@A');
+ _assertResolvedNodeText(annotation, r'''
+Annotation
+ arguments: ArgumentList
+ arguments
+ ListLiteral
+ leftBracket: [
+ rightBracket: ]
+ staticType: List<List<Object?>>
+ leftParenthesis: (
+ rightParenthesis: )
+ atSign: @
+ element: ConstructorMember
+ base: self::@class::A::@constructor::•
+ substitution: {T: Object?}
+ name: SimpleIdentifier
+ staticElement: self::@class::A
+ staticType: null
+ token: A
+''');
+ _assertAnnotationValueText(annotation, r'''
+A<Object?>
+ f: List
+ elementType: List<Object?>
+''');
+ assertElement2(
+ findNode.listLiteral('[]').staticParameterElement,
+ declaration: findElement.fieldFormalParameter('f'),
+ substitution: {'T': 'Object?'},
+ );
+ }
+
test_value_genericClass_inference_namedConstructor() async {
await assertNoErrorsInCode(r'''
class A<T> {
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index fb6d6b1f..3187d2a 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -190,743 +189,6 @@
);
}
- test_error_builtInIdentifierAsTypeName() async {
- await assertErrorsInCode(r'''
-mixin as {}
-''', [
- error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, 6, 2),
- ]);
- }
-
- test_error_builtInIdentifierAsTypeName_OK_on() async {
- await assertNoErrorsInCode(r'''
-class A {}
-
-mixin on on A {}
-
-mixin M on on {}
-
-mixin M2 implements on {}
-
-class B = A with on;
-class C = B with M;
-class D = Object with M2;
-''');
- }
-
- test_error_conflictingTypeVariableAndClass() async {
- await assertErrorsInCode(r'''
-mixin M<M> {}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MIXIN, 8, 1),
- ]);
- }
-
- test_error_conflictingTypeVariableAndMember_field() async {
- await assertErrorsInCode(r'''
-mixin M<T> {
- var T;
-}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
- 1),
- ]);
- }
-
- test_error_conflictingTypeVariableAndMember_getter() async {
- await assertErrorsInCode(r'''
-mixin M<T> {
- get T => null;
-}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
- 1),
- ]);
- }
-
- test_error_conflictingTypeVariableAndMember_method() async {
- await assertErrorsInCode(r'''
-mixin M<T> {
- T() {}
-}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
- 1),
- ]);
- }
-
- test_error_conflictingTypeVariableAndMember_method_static() async {
- await assertErrorsInCode(r'''
-mixin M<T> {
- static T() {}
-}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
- 1),
- ]);
- }
-
- test_error_conflictingTypeVariableAndMember_setter() async {
- await assertErrorsInCode(r'''
-mixin M<T> {
- void set T(_) {}
-}
-''', [
- error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
- 1),
- ]);
- }
-
- test_error_finalNotInitialized() async {
- await assertErrorsInCode(r'''
-mixin M {
- final int f;
-}
-''', [
- error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 22, 1),
- ]);
- }
-
- test_error_finalNotInitialized_OK() async {
- await assertNoErrorsInCode(r'''
-mixin M {
- final int f = 0;
-}
-''');
- }
-
- test_error_implementsClause_deferredClass() async {
- await assertErrorsInCode(r'''
-import 'dart:math' deferred as math;
-mixin M implements math.Random {}
-''', [
- error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 56, 11),
- ]);
- var mathImport = findElement.import('dart:math');
- var randomElement = mathImport.importedLibrary!.getType('Random')!;
-
- var element = findElement.mixin('M');
- assertElementTypes(element.interfaces, ['Random']);
-
- var typeRef = findNode.namedType('Random {}');
- assertNamedType(typeRef, randomElement, 'Random',
- expectedPrefix: mathImport.prefix);
- }
-
- test_error_implementsClause_disallowedClass_int() async {
- await assertErrorsInCode(r'''
-mixin M implements int {}
-''', [
- error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.interfaces, ['int']);
-
- var typeRef = findNode.namedType('int {}');
- assertNamedType(typeRef, intElement, 'int');
- }
-
- test_error_implementsClause_nonClass_void() async {
- await assertErrorsInCode(r'''
-mixin M implements void {}
-''', [
- error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 19, 4),
- error(ParserErrorCode.EXPECTED_TYPE_NAME, 19, 4),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.interfaces, []);
-
- var typeRef = findNode.namedType('void {}');
- assertNamedType(typeRef, null, 'void');
- }
-
- test_error_memberWithClassName_getter() async {
- await assertErrorsInCode(r'''
-mixin M {
- int get M => 0;
-}
-''', [
- error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 20, 1),
- ]);
- }
-
- test_error_memberWithClassName_getter_static() async {
- await assertErrorsInCode(r'''
-mixin M {
- static int get M => 0;
-}
-''', [
- error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 27, 1),
- ]);
- }
-
- test_error_memberWithClassName_setter() async {
- await assertErrorsInCode(r'''
-mixin M {
- void set M(_) {}
-}
-''', [
- error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 21, 1),
- ]);
- }
-
- test_error_memberWithClassName_setter_static() async {
- await assertErrorsInCode(r'''
-mixin M {
- static void set M(_) {}
-}
-''', [
- error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 28, 1),
- ]);
- }
-
- test_error_mixinApplicationConcreteSuperInvokedMemberType_method() async {
- await assertErrorsInCode(r'''
-class I {
- void foo([int? p]) {}
-}
-
-class A {
- void foo(int? p) {}
-}
-
-abstract class B extends A implements I {
- void foo([int? p]);
-}
-
-mixin M on I {
- void bar() {
- super.foo(42);
- }
-}
-
-abstract class X extends B with M {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
- 227,
- 1),
- ]);
- }
-
- test_error_mixinApplicationConcreteSuperInvokedMemberType_OK_method_overriddenInMixin() async {
- await assertNoErrorsInCode(r'''
-class A<T> {
- void remove(T x) {}
-}
-
-mixin M<U> on A<U> {
- void remove(Object? x) {
- super.remove(x as U);
- }
-}
-
-class X<T> = A<T> with M<T>;
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_getter() async {
- await assertErrorsInCode(r'''
-abstract class A {
- int get foo;
-}
-
-mixin M on A {
- void bar() {
- super.foo;
- }
-}
-
-abstract class X extends A with M {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
- 121,
- 1),
- ]);
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_inNextMixin() async {
- await assertErrorsInCode('''
-abstract class A {
- void foo();
-}
-
-mixin M1 on A {
- void foo() {
- super.foo();
- }
-}
-
-mixin M2 on A {
- void foo() {}
-}
-
-class X extends A with M1, M2 {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
- 149,
- 2),
- ]);
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_inSameMixin() async {
- await assertErrorsInCode('''
-abstract class A {
- void foo();
-}
-
-mixin M on A {
- void foo() {
- super.foo();
- }
-}
-
-class X extends A with M {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
- 113,
- 1),
- ]);
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_method() async {
- await assertErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M on A {
- void bar() {
- super.foo();
- }
-}
-
-abstract class X extends A with M {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
- 122,
- 1),
- ]);
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM() async {
- await assertNoErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M on A {
- void bar() {
- super.foo();
- }
-}
-
-class C implements A {
- noSuchMethod(_) {}
-}
-
-class X extends C with M {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM2() async {
- await assertNoErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M on A {
- void bar() {
- super.foo();
- }
-}
-
-/// Class `B` has noSuchMethod forwarder for `foo`.
-class B implements A {
- noSuchMethod(_) {}
-}
-
-/// Class `C` is abstract, but it inherits noSuchMethod forwarders from `B`.
-abstract class C extends B {}
-
-class X extends C with M {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inPreviousMixin() async {
- await assertNoErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M1 {
- void foo() {}
-}
-
-mixin M2 on A {
- void bar() {
- super.foo();
- }
-}
-
-class X extends A with M1, M2 {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inSuper_fromMixin() async {
- await assertNoErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M1 {
- void foo() {}
-}
-
-class B extends A with M1 {}
-
-mixin M2 on A {
- void bar() {
- super.foo();
- }
-}
-
-class X extends B with M2 {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_notInvoked() async {
- await assertNoErrorsInCode(r'''
-abstract class A {
- void foo();
-}
-
-mixin M on A {}
-
-abstract class X extends A with M {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_super_covariant() async {
- await assertNoErrorsInCode(r'''
-class A {
- bar(num n) {}
-}
-
-mixin M on A {
- test() {
- super.bar(3.14);
- }
-}
-
-class B implements A {
- bar(covariant int i) {}
-}
-
-class C extends B with M {}
-''');
- }
-
- test_error_mixinApplicationNoConcreteSuperInvokedMember_setter() async {
- await assertErrorsInCode(r'''
-abstract class A {
- void set foo(_);
-}
-
-mixin M on A {
- void bar() {
- super.foo = 0;
- }
-}
-
-abstract class X extends A with M {}
-''', [
- error(
- CompileTimeErrorCode
- .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
- 129,
- 1),
- ]);
- }
-
- test_error_mixinApplicationNotImplementedInterface() async {
- await assertErrorsInCode(r'''
-class A {}
-
-mixin M on A {}
-
-class X = Object with M;
-''', [
- error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
- 51, 1),
- ]);
- }
-
- test_error_mixinApplicationNotImplementedInterface_generic() async {
- await assertErrorsInCode(r'''
-class A<T> {}
-
-mixin M on A<int> {}
-
-class X = A<double> with M;
-''', [
- error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
- 62, 1),
- ]);
- }
-
- test_error_mixinApplicationNotImplementedInterface_noMemberErrors() async {
- await assertErrorsInCode(r'''
-class A {
- void foo() {}
-}
-
-mixin M on A {
- void bar() {
- super.foo();
- }
-}
-
-class C {
- noSuchMethod(_) {}
-}
-
-class X = C with M;
-''', [
- error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
- 134, 1),
- ]);
- }
-
- test_error_mixinApplicationNotImplementedInterface_OK_0() async {
- await assertNoErrorsInCode(r'''
-mixin M {}
-
-class X = Object with M;
-''');
- }
-
- test_error_mixinApplicationNotImplementedInterface_OK_1() async {
- await assertNoErrorsInCode(r'''
-class A {}
-
-mixin M on A {}
-
-class X = A with M;
-''');
- }
-
- test_error_mixinApplicationNotImplementedInterface_OK_generic() async {
- await assertNoErrorsInCode(r'''
-class A<T> {}
-
-mixin M<T> on A<T> {}
-
-class B<T> implements A<T> {}
-
-class C<T> = B<T> with M<T>;
-''');
- }
-
- test_error_mixinApplicationNotImplementedInterface_OK_previousMixin() async {
- await assertNoErrorsInCode(r'''
-class A {}
-
-mixin M1 implements A {}
-
-mixin M2 on A {}
-
-class X = Object with M1, M2;
-''');
- }
-
- test_error_mixinApplicationNotImplementedInterface_oneOfTwo() async {
- await assertErrorsInCode(r'''
-class A {}
-class B {}
-class C {}
-
-mixin M on A, B {}
-
-class X = C with M;
-''', [
- error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
- 71, 1),
- ]);
- }
-
- test_error_mixinInstantiate_default() async {
- await assertErrorsInCode(r'''
-mixin M {}
-
-main() {
- new M();
-}
-''', [
- error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
- ]);
-
- var creation = findNode.instanceCreation('M();');
- var m = findElement.mixin('M');
- assertInstanceCreation(creation, m, 'M');
- }
-
- test_error_mixinInstantiate_named() async {
- await assertErrorsInCode(r'''
-mixin M {
- M.named() {}
-}
-
-main() {
- new M.named();
-}
-''', [
- error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 12, 1),
- error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 43, 1),
- ]);
-
- var creation = findNode.instanceCreation('M.named();');
- var m = findElement.mixin('M');
- assertInstanceCreation(creation, m, 'M', constructorName: 'named');
- }
-
- test_error_mixinInstantiate_undefined() async {
- await assertErrorsInCode(r'''
-mixin M {}
-
-main() {
- new M.named();
-}
-''', [
- error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
- ]);
-
- var creation = findNode.instanceCreation('M.named();');
- var m = findElement.mixin('M');
- assertElement(creation.constructorName.type2.name, m);
- }
-
- test_error_onClause_deferredClass() async {
- await assertErrorsInCode(r'''
-import 'dart:math' deferred as math;
-mixin M on math.Random {}
-''', [
- error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS,
- 48, 11),
- ]);
- var mathImport = findElement.import('dart:math');
- var randomElement = mathImport.importedLibrary!.getType('Random')!;
-
- var element = findElement.mixin('M');
- assertElementTypes(element.superclassConstraints, ['Random']);
-
- var typeRef = findNode.namedType('Random {}');
- assertNamedType(typeRef, randomElement, 'Random',
- expectedPrefix: mathImport.prefix);
- }
-
- test_error_onClause_disallowedClass_int() async {
- await assertErrorsInCode(r'''
-mixin M on int {}
-''', [
- error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
- 11, 3),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.superclassConstraints, ['int']);
-
- var typeRef = findNode.namedType('int {}');
- assertNamedType(typeRef, intElement, 'int');
- }
-
- test_error_onClause_nonInterface_dynamic() async {
- await assertErrorsInCode(r'''
-mixin M on dynamic {}
-''', [
- error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
- 7),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.superclassConstraints, ['Object']);
-
- var typeRef = findNode.namedType('dynamic {}');
- assertNamedType(typeRef, dynamicElement, 'dynamic');
- }
-
- test_error_onClause_nonInterface_enum() async {
- await assertErrorsInCode(r'''
-enum E {E1, E2, E3}
-mixin M on E {}
-''', [
- error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 31,
- 1),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.superclassConstraints, ['Object']);
-
- var typeRef = findNode.namedType('E {}');
- assertNamedType(typeRef, findElement.enum_('E'), 'E');
- }
-
- test_error_onClause_nonInterface_void() async {
- await assertErrorsInCode(r'''
-mixin M on void {}
-''', [
- error(ParserErrorCode.EXPECTED_TYPE_NAME, 11, 4),
- error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
- 4),
- ]);
-
- var element = findElement.mixin('M');
- assertElementTypes(element.superclassConstraints, ['Object']);
-
- var typeRef = findNode.namedType('void {}');
- assertNamedType(typeRef, null, 'void');
- }
-
- test_error_onClause_OK_mixin() async {
- await assertNoErrorsInCode(r'''
-mixin A {}
-mixin B on A {} // ref
-''');
-
- var b = findElement.mixin('B');
- assertElementTypes(b.superclassConstraints, ['A']);
- }
-
- test_error_undefinedSuperMethod() async {
- await assertErrorsInCode(r'''
-class A {}
-
-mixin M on A {
- void bar() {
- super.foo(42);
- }
-}
-''', [
- error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
- ]);
-
- var invocation = findNode.methodInvocation('foo(42)');
- assertElementNull(invocation.methodName);
- assertInvokeTypeDynamic(invocation);
- assertTypeDynamic(invocation);
- }
-
test_field() async {
await assertNoErrorsInCode(r'''
mixin M<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 226eafa..f8b4487 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -219,6 +219,17 @@
]);
}
+ test_annotation_type_arguments_inferred() async {
+ await assertNoErrorsInCode('''
+@C([])
+int i = 0;
+
+class C<T> {
+ const C(List<List<T>> arg);
+}
+''');
+ }
+
test_annotation_unnamedConstructor() async {
await assertErrorsInCode('''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
index 2923bf7..2a7e27d 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
@@ -30,4 +30,20 @@
error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, 6, 2),
]);
}
+
+ test_mixin_OK_on() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+
+mixin on on A {}
+
+mixin M on on {}
+
+mixin M2 implements on {}
+
+class B = A with on;
+class C = B with M;
+class D = Object with M2;
+''');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 270c1bd..e4fb280 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -80,6 +80,14 @@
error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 22, 1),
]);
}
+
+ test_mixin_OK() async {
+ await assertNoErrorsInCode(r'''
+mixin M {
+ final int f = 0;
+}
+''');
+ }
}
@reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
index 56e199e..bfa2a8d 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
@@ -15,7 +15,7 @@
@reflectiveTest
class ImplementsDeferredClassTest extends PubPackageResolutionTest {
- test_implements() async {
+ test_class_implements() async {
newFile('$testPackageLibPath/lib1.dart', content: '''
library lib1;
class A {}
@@ -29,7 +29,7 @@
]);
}
- test_implements_interfaceTypeTypedef() async {
+ test_class_implements_interfaceTypeTypedef() async {
newFile('$testPackageLibPath/lib1.dart', content: '''
library lib1;
class A {}
@@ -44,7 +44,7 @@
]);
}
- test_mixinApplication() async {
+ test_classTypeAlias() async {
newFile('$testPackageLibPath/lib1.dart', content: '''
library lib1;
class A {}
@@ -59,4 +59,22 @@
error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 100, 3),
]);
}
+
+ test_mixin() async {
+ await assertErrorsInCode(r'''
+import 'dart:math' deferred as math;
+mixin M implements math.Random {}
+''', [
+ error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 56, 11),
+ ]);
+ var mathImport = findElement.import('dart:math');
+ var randomElement = mathImport.importedLibrary!.getType('Random')!;
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.interfaces, ['Random']);
+
+ var typeRef = findNode.namedType('Random {}');
+ assertNamedType(typeRef, randomElement, 'Random',
+ expectedPrefix: mathImport.prefix);
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
index 64e25bc..84629e0 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
@@ -180,4 +180,18 @@
error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 60, 3),
]);
}
+
+ test_mixin_int() async {
+ await assertErrorsInCode(r'''
+mixin M implements int {}
+''', [
+ error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
+ ]);
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.interfaces, ['int']);
+
+ var typeRef = findNode.namedType('int {}');
+ assertNamedType(typeRef, intElement, 'int');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
index 01890bb..8ce99b4 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
@@ -17,6 +17,17 @@
@reflectiveTest
class ImplementsNonClassTest extends PubPackageResolutionTest
with ImplementsNonClassTestCases {
+ test_inEnum_topLevelVariable() async {
+ await assertErrorsInCode(r'''
+int A = 7;
+enum E implements A {
+ v
+}
+''', [
+ error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 29, 1),
+ ]);
+ }
+
test_Never() async {
await assertErrorsInCode('''
class A implements Never {}
@@ -27,16 +38,7 @@
}
mixin ImplementsNonClassTestCases on PubPackageResolutionTest {
- test_class() async {
- await assertErrorsInCode(r'''
-int A = 7;
-class B implements A {}
-''', [
- error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 30, 1),
- ]);
- }
-
- test_dynamic() async {
+ test_inClass_dynamic() async {
await assertErrorsInCode('''
class A implements dynamic {}
''', [
@@ -44,7 +46,7 @@
]);
}
- test_enum() async {
+ test_inClass_enum() async {
await assertErrorsInCode(r'''
enum E { ONE }
class A implements E {}
@@ -53,7 +55,16 @@
]);
}
- test_typeAlias() async {
+ test_inClass_topLevelVariable() async {
+ await assertErrorsInCode(r'''
+int A = 7;
+class B implements A {}
+''', [
+ error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 30, 1),
+ ]);
+ }
+
+ test_inClassTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
@@ -63,6 +74,14 @@
error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 63, 1),
]);
}
+
+ test_inMixin_dynamic() async {
+ await assertErrorsInCode(r'''
+mixin M implements dynamic {}
+''', [
+ error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 19, 7),
+ ]);
+ }
}
@reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 726f456..fb7e87c 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -74,6 +74,19 @@
]);
}
+ test_invalid_interfaceType_enum_interfaces() async {
+ await assertErrorsInCode('''
+class I {}
+class J {}
+enum E implements J {
+ v
+}
+I x = E.v;
+''', [
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 56, 3),
+ ]);
+ }
+
test_invalid_noCall_functionContext() async {
await assertErrorsInCode('''
class C {}
@@ -261,6 +274,16 @@
''');
}
+ test_valid_interfaceType_enum_interfaces() async {
+ await assertNoErrorsInCode('''
+class I {}
+enum E implements I {
+ v
+}
+I x = E.v;
+''');
+ }
+
test_valid_nonGenericCall() async {
await assertNoErrorsInCode('''
class C {
diff --git a/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart b/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
index abe984c..d9583c5 100644
--- a/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
@@ -15,7 +15,7 @@
@reflectiveTest
class MemberWithClassNameTest extends PubPackageResolutionTest {
- test_field() async {
+ test_class_field() async {
await assertErrorsInCode(r'''
class A {
int A = 0;
@@ -25,7 +25,7 @@
]);
}
- test_field_multiple() async {
+ test_class_field_multiple() async {
await assertErrorsInCode(r'''
class A {
int z = 0, A = 0, b = 0;
@@ -35,7 +35,7 @@
]);
}
- test_getter() async {
+ test_class_getter() async {
await assertErrorsInCode(r'''
class A {
get A => 0;
@@ -45,8 +45,48 @@
]);
}
- test_method() async {
+ test_class_method() async {
// No test because a method named the same as the enclosing class is
// indistinguishable from a constructor.
}
+
+ test_mixin_getter() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ int get M => 0;
+}
+''', [
+ error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 20, 1),
+ ]);
+ }
+
+ test_mixin_getter_static() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ static int get M => 0;
+}
+''', [
+ error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 27, 1),
+ ]);
+ }
+
+ test_mixin_setter() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ void set M(_) {}
+}
+''', [
+ error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 21, 1),
+ ]);
+ }
+
+ test_mixin_setter_static() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ static void set M(_) {}
+}
+''', [
+ error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 28, 1),
+ ]);
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart
new file mode 100644
index 0000000..37dd4c5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MixinApplicationConcreteSuperInvokedMemberTypeTest);
+ });
+}
+
+@reflectiveTest
+class MixinApplicationConcreteSuperInvokedMemberTypeTest
+ extends PubPackageResolutionTest {
+ test_method() async {
+ await assertErrorsInCode(r'''
+class I {
+ void foo([int? p]) {}
+}
+
+class A {
+ void foo(int? p) {}
+}
+
+abstract class B extends A implements I {
+ void foo([int? p]);
+}
+
+mixin M on I {
+ void bar() {
+ super.foo(42);
+ }
+}
+
+abstract class X extends B with M {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
+ 227,
+ 1),
+ ]);
+ }
+
+ test_method_OK_overriddenInMixin() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {
+ void remove(T x) {}
+}
+
+mixin M<U> on A<U> {
+ void remove(Object? x) {
+ super.remove(x as U);
+ }
+}
+
+class X<T> = A<T> with M<T>;
+''');
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart
new file mode 100644
index 0000000..71d5ed5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart
@@ -0,0 +1,250 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MixinApplicationNoConcreteSuperInvokedMemberTest);
+ });
+}
+
+@reflectiveTest
+class MixinApplicationNoConcreteSuperInvokedMemberTest
+ extends PubPackageResolutionTest {
+ test_getter() async {
+ await assertErrorsInCode(r'''
+abstract class A {
+ int get foo;
+}
+
+mixin M on A {
+ void bar() {
+ super.foo;
+ }
+}
+
+abstract class X extends A with M {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+ 121,
+ 1),
+ ]);
+ }
+
+ test_inNextMixin() async {
+ await assertErrorsInCode('''
+abstract class A {
+ void foo();
+}
+
+mixin M1 on A {
+ void foo() {
+ super.foo();
+ }
+}
+
+mixin M2 on A {
+ void foo() {}
+}
+
+class X extends A with M1, M2 {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+ 149,
+ 2),
+ ]);
+ }
+
+ test_inSameMixin() async {
+ await assertErrorsInCode('''
+abstract class A {
+ void foo();
+}
+
+mixin M on A {
+ void foo() {
+ super.foo();
+ }
+}
+
+class X extends A with M {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+ 113,
+ 1),
+ ]);
+ }
+
+ test_method() async {
+ await assertErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+abstract class X extends A with M {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+ 122,
+ 1),
+ ]);
+ }
+
+ test_OK_hasNSM() async {
+ await assertNoErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+class C implements A {
+ noSuchMethod(_) {}
+}
+
+class X extends C with M {}
+''');
+ }
+
+ test_OK_hasNSM2() async {
+ await assertNoErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+/// Class `B` has noSuchMethod forwarder for `foo`.
+class B implements A {
+ noSuchMethod(_) {}
+}
+
+/// Class `C` is abstract, but it inherits noSuchMethod forwarders from `B`.
+abstract class C extends B {}
+
+class X extends C with M {}
+''');
+ }
+
+ test_OK_inPreviousMixin() async {
+ await assertNoErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M1 {
+ void foo() {}
+}
+
+mixin M2 on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+class X extends A with M1, M2 {}
+''');
+ }
+
+ test_OK_inSuper_fromMixin() async {
+ await assertNoErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M1 {
+ void foo() {}
+}
+
+class B extends A with M1 {}
+
+mixin M2 on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+class X extends B with M2 {}
+''');
+ }
+
+ test_OK_notInvoked() async {
+ await assertNoErrorsInCode(r'''
+abstract class A {
+ void foo();
+}
+
+mixin M on A {}
+
+abstract class X extends A with M {}
+''');
+ }
+
+ test_OK_super_covariant() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ bar(num n) {}
+}
+
+mixin M on A {
+ test() {
+ super.bar(3.14);
+ }
+}
+
+class B implements A {
+ bar(covariant int i) {}
+}
+
+class C extends B with M {}
+''');
+ }
+
+ test_setter() async {
+ await assertErrorsInCode(r'''
+abstract class A {
+ void set foo(_);
+}
+
+mixin M on A {
+ void bar() {
+ super.foo = 0;
+ }
+}
+
+abstract class X extends A with M {}
+''', [
+ error(
+ CompileTimeErrorCode
+ .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+ 129,
+ 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
index 0266782..9354651a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
@@ -16,6 +16,19 @@
@reflectiveTest
class MixinApplicationNotImplementedInterfaceTest
extends PubPackageResolutionTest {
+ test_generic() async {
+ await assertErrorsInCode(r'''
+class A<T> {}
+
+mixin M on A<int> {}
+
+class X = A<double> with M;
+''', [
+ error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+ 62, 1),
+ ]);
+ }
+
test_matchingClass_inPreviousMixin_new_syntax() async {
await assertNoErrorsInCode('''
abstract class A<T> {}
@@ -80,6 +93,99 @@
]);
}
+ test_noMemberErrors() async {
+ await assertErrorsInCode(r'''
+class A {
+ void foo() {}
+}
+
+mixin M on A {
+ void bar() {
+ super.foo();
+ }
+}
+
+class C {
+ noSuchMethod(_) {}
+}
+
+class X = C with M;
+''', [
+ error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+ 134, 1),
+ ]);
+ }
+
+ test_notGeneric() async {
+ await assertErrorsInCode(r'''
+class A {}
+
+mixin M on A {}
+
+class X = Object with M;
+''', [
+ error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+ 51, 1),
+ ]);
+ }
+
+ test_OK_0() async {
+ await assertNoErrorsInCode(r'''
+mixin M {}
+
+class X = Object with M;
+''');
+ }
+
+ test_OK_1() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+
+mixin M on A {}
+
+class X = A with M;
+''');
+ }
+
+ test_OK_generic() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {}
+
+mixin M<T> on A<T> {}
+
+class B<T> implements A<T> {}
+
+class C<T> = B<T> with M<T>;
+''');
+ }
+
+ test_OK_previousMixin() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+
+mixin M1 implements A {}
+
+mixin M2 on A {}
+
+class X = Object with M1, M2;
+''');
+ }
+
+ test_oneOfTwo() async {
+ await assertErrorsInCode(r'''
+class A {}
+class B {}
+class C {}
+
+mixin M on A, B {}
+
+class X = C with M;
+''', [
+ error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+ 71, 1),
+ ]);
+ }
+
test_recursiveSubtypeCheck_new_syntax() async {
// See dartbug.com/32353 for a detailed explanation.
await assertErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart
new file mode 100644
index 0000000..ff289367
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MixinInstantiateTest);
+ });
+}
+
+@reflectiveTest
+class MixinInstantiateTest extends PubPackageResolutionTest {
+ test_namedConstructor() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ M.named() {}
+}
+
+main() {
+ new M.named();
+}
+''', [
+ error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 12, 1),
+ error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 43, 1),
+ ]);
+
+ var creation = findNode.instanceCreation('M.named();');
+ var m = findElement.mixin('M');
+ assertInstanceCreation(creation, m, 'M', constructorName: 'named');
+ }
+
+ test_namedConstructor_undefined() async {
+ await assertErrorsInCode(r'''
+mixin M {}
+
+main() {
+ new M.named();
+}
+''', [
+ error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
+ ]);
+
+ var creation = findNode.instanceCreation('M.named();');
+ var m = findElement.mixin('M');
+ assertElement(creation.constructorName.type2.name, m);
+ }
+
+ test_unnamedConstructor() async {
+ await assertErrorsInCode(r'''
+mixin M {}
+
+main() {
+ new M();
+}
+''', [
+ error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
+ ]);
+
+ var creation = findNode.instanceCreation('M();');
+ var m = findElement.mixin('M');
+ assertInstanceCreation(creation, m, 'M');
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
index 47c9fd2..beb970a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
@@ -17,6 +17,36 @@
@reflectiveTest
class MixinOfNonClassTest extends PubPackageResolutionTest
with MixinOfNonClassTestCases {
+ test_enum_enum() async {
+ await assertErrorsInCode(r'''
+enum E1 { v }
+enum E2 with E1 { v }
+''', [
+ error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 27, 2),
+ ]);
+ }
+
+ test_enum_topLevelVariable() async {
+ await assertErrorsInCode(r'''
+int A = 7;
+enum E with A {
+ v
+}
+''', [
+ error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 23, 1),
+ ]);
+ }
+
+ test_enum_undefined() async {
+ await assertErrorsInCode(r'''
+enum E with M {
+ v
+}
+''', [
+ error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 12, 1),
+ ]);
+ }
+
test_Never() async {
await assertErrorsInCode('''
class A with Never {}
@@ -27,16 +57,7 @@
}
mixin MixinOfNonClassTestCases on PubPackageResolutionTest {
- test_class() async {
- await assertErrorsInCode(r'''
-int A = 7;
-class B extends Object with A {}
-''', [
- error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 1),
- ]);
- }
-
- test_enum() async {
+ test_class_enum() async {
await assertErrorsInCode(r'''
enum E { ONE }
class A extends Object with E {}
@@ -45,19 +66,16 @@
]);
}
- @failingTest
- test_non_class() async {
- // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
- // TODO(brianwilkerson) Fix the offset and length.
+ test_class_topLevelVariable() async {
await assertErrorsInCode(r'''
-var A;
-class B extends Object mixin A {}
+int A = 7;
+class B extends Object with A {}
''', [
- error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 0, 0),
+ error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 1),
]);
}
- test_typeAlias() async {
+ test_class_typeAlias() async {
await assertErrorsInCode(r'''
class A {}
int B = 7;
@@ -67,7 +85,7 @@
]);
}
- test_undefined() async {
+ test_class_undefined() async {
await assertErrorsInCode(r'''
class C with M {}
''', [
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart
new file mode 100644
index 0000000..4985163
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MixinSuperClassConstraintDeferredClassTest);
+ });
+}
+
+@reflectiveTest
+class MixinSuperClassConstraintDeferredClassTest
+ extends PubPackageResolutionTest {
+ test_error_onClause_deferredClass() async {
+ await assertErrorsInCode(r'''
+import 'dart:math' deferred as math;
+mixin M on math.Random {}
+''', [
+ error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS,
+ 48, 11),
+ ]);
+ var mathImport = findElement.import('dart:math');
+ var randomElement = mathImport.importedLibrary!.getType('Random')!;
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.superclassConstraints, ['Random']);
+
+ var typeRef = findNode.namedType('Random {}');
+ assertNamedType(typeRef, randomElement, 'Random',
+ expectedPrefix: mathImport.prefix);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart
new file mode 100644
index 0000000..f52ca1e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MixinSuperClassConstraintDisallowedClassTest);
+ });
+}
+
+@reflectiveTest
+class MixinSuperClassConstraintDisallowedClassTest
+ extends PubPackageResolutionTest {
+ test_int() async {
+ await assertErrorsInCode(r'''
+mixin M on int {}
+''', [
+ error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
+ 11, 3),
+ ]);
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.superclassConstraints, ['int']);
+
+ var typeRef = findNode.namedType('int {}');
+ assertNamedType(typeRef, intElement, 'int');
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
index 08db55e..282e9eb 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -16,6 +17,37 @@
@reflectiveTest
class MixinSuperClassConstraintNonInterfaceTest
extends PubPackageResolutionTest {
+ test_dynamic() async {
+ await assertErrorsInCode(r'''
+mixin M on dynamic {}
+''', [
+ error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
+ 7),
+ ]);
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.superclassConstraints, ['Object']);
+
+ var typeRef = findNode.namedType('dynamic {}');
+ assertNamedType(typeRef, dynamicElement, 'dynamic');
+ }
+
+ test_enum() async {
+ await assertErrorsInCode(r'''
+enum E { v }
+mixin M on E {}
+''', [
+ error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 24,
+ 1),
+ ]);
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.superclassConstraints, ['Object']);
+
+ var typeRef = findNode.namedType('E {}');
+ assertNamedType(typeRef, findElement.enum_('E'), 'E');
+ }
+
test_Never() async {
await assertErrorsInCode('''
mixin M on Never {}
@@ -24,4 +56,20 @@
5),
]);
}
+
+ test_void() async {
+ await assertErrorsInCode(r'''
+mixin M on void {}
+''', [
+ error(ParserErrorCode.EXPECTED_TYPE_NAME, 11, 4),
+ error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
+ 4),
+ ]);
+
+ var element = findElement.mixin('M');
+ assertElementTypes(element.superclassConstraints, ['Object']);
+
+ var typeRef = findNode.namedType('void {}');
+ assertNamedType(typeRef, null, 'void');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
index 3ae9041..8c13030 100644
--- a/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
@@ -101,6 +101,17 @@
]);
}
+ test_propertyAccess_field_toplevel_generic() async {
+ await assertErrorsInCode('''
+class C<T> {
+ List<T> t = [];
+}
+var x = C.t;
+''', [
+ error(CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, 43, 1),
+ ]);
+ }
+
test_propertyAccess_getter() async {
await assertErrorsInCode('''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 2529d3a..40513d8 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -413,6 +413,10 @@
import 'missing_return_test.dart' as missing_return;
import 'missing_size_annotation_carray_test.dart'
as missing_size_annotation_carray;
+import 'mixin_application_concrete_super_invoked_member_type_test.dart'
+ as mixin_application_concrete_super_invoked_member_type;
+import 'mixin_application_no_concrete_super_invoked_member_test.dart'
+ as mixin_application_no_concrete_super_invoked_member;
import 'mixin_application_not_implemented_interface_test.dart'
as mixin_application_not_implemented_interface;
import 'mixin_class_declares_constructor_test.dart'
@@ -423,6 +427,7 @@
as mixin_inference_no_possible_substitution;
import 'mixin_inherits_from_not_object_test.dart'
as mixin_inherits_from_not_object;
+import 'mixin_instantiate_test.dart' as mixin_instantiate_test;
import 'mixin_of_disallowed_class_test.dart' as mixin_of_disallowed_class;
import 'mixin_of_non_class_test.dart' as mixin_of_non_class;
import 'mixin_of_type_alias_expands_to_type_parameter_test.dart'
@@ -430,6 +435,10 @@
import 'mixin_on_sealed_class_test.dart' as mixin_on_sealed_class;
import 'mixin_on_type_alias_expands_to_type_parameter_test.dart'
as mixin_on_type_alias_expands_to_type_parameter;
+import 'mixin_super_class_constraint_deferred_class_test.dart'
+ as mixin_super_class_constraint_deferred_class;
+import 'mixin_super_class_constraint_disallowed_class_test.dart'
+ as mixin_super_class_constraint_disallowed_class;
import 'mixin_super_class_constraint_non_interface_test.dart'
as mixin_super_class_constraint_non_interface;
import 'mixin_with_non_class_superclass_test.dart'
@@ -690,6 +699,7 @@
as undefined_referenced_parameter;
import 'undefined_setter_test.dart' as undefined_setter;
import 'undefined_shown_name_test.dart' as undefined_shown_name;
+import 'undefined_super_method_test.dart' as undefined_super_method;
import 'unignorable_ignore_test.dart' as unignorable_ignore;
import 'unnecessary_cast_test.dart' as unnecessary_cast;
import 'unnecessary_ignore_test.dart' as unnecessary_ignore;
@@ -1005,17 +1015,22 @@
missing_required_param.main();
missing_return.main();
missing_size_annotation_carray.main();
+ mixin_application_concrete_super_invoked_member_type.main();
+ mixin_application_no_concrete_super_invoked_member.main();
mixin_application_not_implemented_interface.main();
mixin_class_declares_constructor.main();
mixin_declares_constructor.main();
mixin_deferred_class.main();
mixin_inference_no_possible_substitution.main();
mixin_inherits_from_not_object.main();
+ mixin_instantiate_test.main();
mixin_of_disallowed_class.main();
mixin_of_non_class.main();
mixin_of_type_alias_expands_to_type_parameter.main();
mixin_on_sealed_class.main();
mixin_on_type_alias_expands_to_type_parameter.main();
+ mixin_super_class_constraint_deferred_class.main();
+ mixin_super_class_constraint_disallowed_class.main();
mixin_super_class_constraint_non_interface.main();
mixin_with_non_class_superclass.main();
mixins_super_class.main();
@@ -1194,6 +1209,7 @@
undefined_referenced_parameter.main();
undefined_setter.main();
undefined_shown_name.main();
+ undefined_super_method.main();
unignorable_ignore.main();
unnecessary_import.main();
unnecessary_cast.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart
new file mode 100644
index 0000000..0c1192c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(UndefinedSuperMethodTest);
+ });
+}
+
+@reflectiveTest
+class UndefinedSuperMethodTest extends PubPackageResolutionTest {
+ test_error_undefinedSuperMethod() async {
+ await assertErrorsInCode(r'''
+class A {}
+
+mixin M on A {
+ void bar() {
+ super.foo(42);
+ }
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
+ ]);
+
+ var invocation = findNode.methodInvocation('foo(42)');
+ assertElementNull(invocation.methodName);
+ assertInvokeTypeDynamic(invocation);
+ assertTypeDynamic(invocation);
+ }
+}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 5b4aab2..09f2671 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -213,7 +213,6 @@
selfUriStr: selfUriStr,
sink: buffer,
indent: indent,
- withNullability: true,
withOffsets: true,
);
}
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 3ca0b95..e7a44e0 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -33,9 +33,6 @@
/// The optional provider for code lines, might be `null`.
final CodeLinesProvider? _codeLinesProvider;
- /// If `true`, types should be printed with nullability suffixes.
- final bool _withNullability;
-
/// If `true`, selected tokens and nodes should be printed with offsets.
final bool _withOffsets;
@@ -46,12 +43,10 @@
required StringSink sink,
required String indent,
CodeLinesProvider? codeLinesProvider,
- bool withNullability = false,
bool withOffsets = false,
}) : _selfUriStr = selfUriStr,
_sink = sink,
_codeLinesProvider = codeLinesProvider,
- _withNullability = withNullability,
_withOffsets = withOffsets,
_indent = indent;
@@ -1830,7 +1825,7 @@
/// TODO(scheglov) Make [type] non-nullable?
String? _typeStr(DartType? type) {
- return type?.getDisplayString(withNullability: _withNullability);
+ return type?.getDisplayString(withNullability: true);
}
void _withIndent(void Function() f) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 2610746..d171c1a 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17983,6 +17983,299 @@
''');
}
+ test_enum_getter() async {
+ var library = await checkLibrary(r'''
+enum E{
+ v;
+ int get foo => 0;
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ enums
+ enum E @5
+ supertype: Enum
+ fields
+ static const enumConstant v @10
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ synthetic foo @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ get foo @23
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+''');
+ }
+
+ test_enum_interfaces() async {
+ var library = await checkLibrary(r'''
+class I {}
+enum E implements I {
+ v;
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class I @6
+ constructors
+ synthetic @-1
+ enums
+ enum E @16
+ supertype: Enum
+ interfaces
+ I
+ fields
+ static const enumConstant v @35
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+''');
+ }
+
+ test_enum_interfaces_generic() async {
+ var library = await checkLibrary(r'''
+class I<T> {}
+enum E<U> implements I<U> {
+ v;
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class I @6
+ typeParameters
+ covariant T @8
+ defaultType: dynamic
+ constructors
+ synthetic @-1
+ enums
+ enum E @19
+ typeParameters
+ covariant U @21
+ defaultType: dynamic
+ supertype: Enum
+ interfaces
+ I<U>
+ fields
+ static const enumConstant v @44
+ type: E<dynamic>
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: ConstructorMember
+ base: self::@enum::E::@constructor::•
+ substitution: {U: dynamic}
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: ConstructorMember
+ base: self::@enum::E::@constructor::•
+ substitution: {U: 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>>
+ synthetic final index @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E<dynamic>
+ synthetic static get values @-1
+ returnType: List<E<dynamic>>
+ synthetic get index @-1
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+''');
+ }
+
+ test_enum_interfaces_unresolved() async {
+ var library = await checkLibrary('''
+class X {}
+class Z {}
+enum E implements X, Y, Z {
+ v
+}
+''', allowErrors: true);
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class X @6
+ constructors
+ synthetic @-1
+ class Z @17
+ constructors
+ synthetic @-1
+ enums
+ enum E @27
+ supertype: Enum
+ interfaces
+ X
+ Z
+ fields
+ static const enumConstant v @52
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+''');
+ }
+
test_enum_method() async {
var library = await checkLibrary(r'''
enum E<T> {
@@ -18127,6 +18420,234 @@
''');
}
+ test_enum_mixins() async {
+ var library = await checkLibrary(r'''
+mixin M {}
+enum E with M {
+ v;
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ enums
+ enum E @16
+ supertype: Enum
+ mixins
+ M
+ fields
+ static const enumConstant v @29
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+ mixins
+ mixin M @6
+ superclassConstraints
+ Object
+ constructors
+ synthetic @-1
+''');
+ }
+
+ test_enum_mixins_inference() async {
+ var library = await checkLibrary(r'''
+mixin M1<T> {}
+mixin M2<T> on M1<T> {}
+enum E with M1<int>, M2 {
+ v;
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ enums
+ enum E @44
+ supertype: Enum
+ mixins
+ M1<int>
+ M2<int>
+ fields
+ static const enumConstant v @67
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ methods
+ synthetic toString @-1
+ returnType: String
+ mixins
+ mixin M1 @6
+ typeParameters
+ covariant T @9
+ defaultType: dynamic
+ superclassConstraints
+ Object
+ constructors
+ synthetic @-1
+ mixin M2 @21
+ typeParameters
+ covariant T @24
+ defaultType: dynamic
+ superclassConstraints
+ M1<T>
+ constructors
+ synthetic @-1
+''');
+ }
+
+ test_enum_setter() async {
+ var library = await checkLibrary(r'''
+enum E{
+ v;
+ set foo(int _) {}
+}
+''');
+ checkElementText(library, r'''
+library
+ definingUnit
+ enums
+ enum E @5
+ supertype: Enum
+ fields
+ static const enumConstant v @10
+ type: E
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ leftParenthesis: ( @0
+ rightParenthesis: ) @0
+ constructorName: ConstructorName
+ name: SimpleIdentifier
+ staticElement: self::@enum::E::@constructor::•
+ staticType: null
+ token: @-1
+ period: . @0
+ staticElement: self::@enum::E::@constructor::•
+ type: NamedType
+ name: SimpleIdentifier
+ staticElement: self::@enum::E
+ staticType: null
+ token: E @-1
+ type: E
+ staticType: E
+ synthetic static const values @-1
+ type: List<E>
+ constantInitializer
+ ListLiteral
+ elements
+ SimpleIdentifier
+ staticElement: self::@enum::E::@getter::v
+ staticType: E
+ token: v @-1
+ leftBracket: [ @0
+ rightBracket: ] @0
+ staticType: List<E>
+ synthetic final index @-1
+ type: int
+ synthetic foo @-1
+ type: int
+ constructors
+ synthetic const @-1
+ accessors
+ synthetic static get v @-1
+ returnType: E
+ synthetic static get values @-1
+ returnType: List<E>
+ synthetic get index @-1
+ returnType: int
+ set foo @19
+ parameters
+ requiredPositional _ @27
+ type: int
+ returnType: void
+ methods
+ synthetic toString @-1
+ returnType: String
+''');
+ }
+
test_enum_typeParameters() async {
var library = await checkLibrary('''
enum E<T> {
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 37c495b..0156152 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -6,6 +6,7 @@
import '../constants/values.dart' show ConstantValue;
import '../elements/entities.dart';
+import '../native/behavior.dart' show NativeBehavior;
import '../universe/world_impact.dart' show WorldImpact;
import '../universe/feature.dart';
@@ -20,8 +21,7 @@
Iterable<ConstantValue> get constantLiterals => const <ConstantValue>[];
Iterable<ClassEntity> get seenClasses => const <ClassEntity>[];
Iterable<RuntimeTypeUse> get runtimeTypeUses => const <RuntimeTypeUse>[];
-
- Iterable<dynamic> get nativeData => const <dynamic>[];
+ Iterable<NativeBehavior> get nativeData => const <NativeBehavior>[];
Iterable<GenericInstantiation> get genericInstantiations =>
const <GenericInstantiation>[];
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 82c7200..07f2138 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -44,33 +44,61 @@
return freshName;
}
- // From issue 7554. These should not be used on objects (as instance
- // variables) because they clash with names from the DOM. However, it is
- // OK to use them as fields, as we only access fields directly if we know
- // the receiver type.
+ /// Property names that are used on 'native' JavaScript classes.
+ ///
+ /// It is best not to use these names for dynamic call selectors.
+ ///
+ /// Dynamic calls to selectors that are used on an intercepted (e.g. String)
+ /// class (e.g. String) or native class (e.g. HtmlElement) are not a problem
+ /// since they are handled via the interceptor calling mechanism. Other
+ /// selectors are called directly, so the minified selector should not be a
+ /// name that accidentally collides with a JavaScript method. For example,
+ /// the minified call site for the dynamic call `item.yowza()` should not be
+ /// `x.at()`, since, if `x` was a String, that would call
+ /// `String.prototype.at` instead of generating an error.
+ ///
+ /// These names are reserved for the property names of fields, since fields
+ /// are always accessed from a know receiver. (A 'field' of an unknown
+ /// receiver would actually be the getter method.)
+ ///
+ /// These names could be used for selectors that use the interceptor calling
+ /// convention, or for selectors are not called from a `dynamic` call site, or
+ /// any other use where the JavaScript receiver is constrained to be something
+ /// from within the dart program.
+ ///
+ /// TODO(7554): Refresh periodically.
static const List<String> _reservedNativeProperties = [
- 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q',
- // 2-letter:
- 'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1',
- 'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2',
- // 3-letter:
- 'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1',
- 'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21',
- 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43',
- 'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB',
- 'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL',
- // 4-letter:
- 'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias',
- 'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE',
- 'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face',
- 'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head',
- 'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT',
- 'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
- 'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE',
- 'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX',
- 'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send',
- 'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text',
- 'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO'
+ // 1 character
+ 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'w', 'x', 'y', 'z', 'Q',
+
+ // 2 characters
+ 'as', 'at', 'ax', 'ay', 'ch', 'CW', 'cx', 'cy', 'db', 'dx', 'dy', 'fr',
+ 'fx', 'fy', 'go', 'id', 'k1', 'k2', 'k3', 'k4', 'ok', 'p1', 'p2', 'p3',
+ 'p4', 'R8', 'RG', 'rx', 'ry', 'to', 'x1', 'x2', 'xr', 'y1', 'y2',
+
+ // 3 characters
+ 'add', 'all', 'alt', 'arc', 'big', 'CCW', 'cmp', 'csp', 'dir', 'div', 'end',
+ 'eye', 'get', 'has', 'hid', 'in1', 'in2', 'ink', 'INT', 'key', 'low', 'm11',
+ 'm12', 'm13', 'm14', 'm21', 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34',
+ 'm41', 'm42', 'm43', 'm44', 'map', 'max', 'MAX', 'mid', 'min', 'MIN', 'mul',
+ 'now', 'ONE', 'pad', 'pan', 'pop', 'put', 'R8I', 'RED', 'rel', 'rev', 'RG8',
+ 'RGB', 'rtt', 'sdp', 'set', 'src', 'sub', 'sup', 'tag', 'tee', 'top', 'upX',
+ 'upY', 'upZ', 'url', 'URL', 'usb',
+
+ // 4 characters
+ 'abbr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias', 'bind', 'blob',
+ 'blur', 'body', 'bold', 'BOOL', 'BYTE', 'call', 'cite', 'city', 'clip',
+ 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'dtmf', 'exec', 'face',
+ 'fill', 'find', 'flat', 'font', 'form', 'gain', 'hash', 'head', 'hide',
+ 'high', 'hint', 'host', 'href', 'icon', 'INCR', 'is2D', 'item', 'join',
+ 'json', 'KEEP', 'keys', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
+ 'link', 'list', 'load', 'lock', 'loop', 'mark', 'mode', 'name', 'node',
+ 'NONE', 'open', 'OPEN', 'part', 'path', 'ping', 'play', 'port', 'push',
+ 'R16F', 'R16I', 'R32F', 'R32I', 'R8UI', 'rate', 'read', 'rect', 'refX',
+ 'refY', 'RG8I', 'RGB8', 'RGBA', 'role', 'root', 'rows', 'save', 'sctp',
+ 'seed', 'seek', 'send', 'show', 'sign', 'size', 'slot', 'some', 'sort',
+ 'span', 'SRGB', 'step', 'stop', 'sync', 'test', 'text', 'then', 'time',
+ 'tone', 'trim', 'type', 'unit', 'view', 'wrap', 'ZERO',
];
void reserveBackendNames() {
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 9435c0b..0d4480f 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -8,6 +8,7 @@
import '../constants/values.dart';
import '../elements/entities.dart' show ClassEntity, MemberEntity;
import '../elements/types.dart';
+import '../native/behavior.dart' show NativeBehavior;
import '../universe/feature.dart';
import '../universe/world_impact.dart' show WorldImpact, WorldImpactBuilderImpl;
import '../util/enumset.dart' show EnumSet;
@@ -24,7 +25,7 @@
Setlet<ListLiteralUse> _listLiterals;
Setlet<String> _constSymbolNames;
Setlet<ConstantValue> _constantLiterals;
- Setlet<dynamic> _nativeData;
+ Setlet<NativeBehavior> _nativeData;
Setlet<ClassEntity> _seenClasses;
Set<RuntimeTypeUse> _runtimeTypeUses;
Set<GenericInstantiation> _genericInstantiations;
@@ -98,14 +99,14 @@
@override
Iterable<ConstantValue> get constantLiterals => _constantLiterals ?? const [];
- void registerNativeData(dynamic nativeData) {
+ void registerNativeData(NativeBehavior nativeData) {
assert(nativeData != null);
_nativeData ??= Setlet();
_nativeData.add(nativeData);
}
@override
- Iterable<dynamic> get nativeData => _nativeData ?? const [];
+ Iterable<NativeBehavior> get nativeData => _nativeData ?? const [];
void registerSeenClass(ClassEntity seenClass) {
_seenClasses ??= Setlet();
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 7bd3dde..8c57682 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3760,12 +3760,22 @@
/// The part of string interpolation which converts and interpolated expression
/// into a String value.
class HStringify extends HInstruction {
+ bool _isPure = false; // Some special cases are pure, e.g. int argument.
HStringify(HInstruction input, AbstractValue resultType)
: super([input], resultType) {
sideEffects.setAllSideEffects();
sideEffects.setDependsOnSomething();
}
+ void setPure() {
+ sideEffects.clearAllDependencies();
+ sideEffects.clearAllSideEffects();
+ _isPure = true;
+ }
+
+ @override
+ bool canThrow(AbstractValueDomain domain) => !_isPure;
+
@override
accept(HVisitor visitor) => visitor.visitStringify(this);
@override
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 0475798..3b1f064 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1918,6 +1918,13 @@
return null;
}
+ // For primitives we know the stringifier is effect-free and never throws.
+ if (input.isNumberOrNull(_abstractValueDomain).isDefinitelyTrue ||
+ input.isStringOrNull(_abstractValueDomain).isDefinitelyTrue ||
+ input.isBooleanOrNull(_abstractValueDomain).isDefinitelyTrue) {
+ node.setPure();
+ }
+
return tryConstant() ?? tryToString() ?? node;
}
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 7683874..ca69de6 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -34,11 +34,6 @@
import 'world_builder.dart';
abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
- /// Returns `true` if [member] has been marked as used (called, read, etc.) in
- /// this world builder.
- // TODO(johnniwinther): Maybe this should be part of [ClosedWorld] (instead).
- bool isMemberUsed(MemberEntity member);
-
/// The closed world computed by this world builder.
///
/// This is only available after the world builder has been closed.
@@ -903,11 +898,6 @@
}
}
- @override
- bool isMemberUsed(MemberEntity member) {
- return _memberUsage[member]?.hasUse ?? false;
- }
-
Map<ClassEntity, Set<ClassEntity>> populateHierarchyNodes() {
Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses = {};
diff --git a/pkg/compiler/tool/used_names/README.md b/pkg/compiler/tool/used_names/README.md
new file mode 100644
index 0000000..5fd8bf6
--- /dev/null
+++ b/pkg/compiler/tool/used_names/README.md
@@ -0,0 +1,52 @@
+## used_names.html
+
+To run this program, visit
+[`pkg/compiler/tool/used_names/used_names.html`](used_names.html) in a browser.
+
+The page will display a list of short names that are defined as properties on
+all the objects available from `window`. The names are sorted by size, and then
+alphabetically ignoring case, and finally by case. They are quoted for easy
+copy-paste into a Dart source file.
+
+This data is to be used for editing tables of names that the minifying namer
+should avoid in some circumstances. These names should be in the table, but
+other names might need to be in the table too.
+
+### Why these names?
+
+There are contexts where dart2js generates `a.b()` with the expectation that it
+will either call an instance method in the Dart program or crash with a
+JavaScript TypeError for an undefined function. The minifier code can't use
+certain names for `b` since it won't crash, for example `toString`, or `length`,
+which might result in a less clear diagnostic.
+
+An example of this use is in dynamic calls to methods that do not need the
+special 'interceptor' calling convention used on native objects like Arrays,
+Strings, numbers and @Native classes. Dynamic calls use the same selector as
+instance calls.
+
+In unminified code we arrange that the selectors are descriptive of the call
+site structure, e.g. `toString$0` or `get$length`. These generally are not
+defined in the execution environment.
+
+For minified code, we want to pick names as short as possible, so there is a
+chance that the short names will conflict with one defined in the environment.
+For example, minifying something to `a.at()` might call `String.prototype.at`.
+
+### Discussion
+
+In retrospect the decision to use names that Dart has no control over is not the
+best. When this part of the compiler was written, the language was still very
+dynamic (Dart 1) and there were very few program that extensively used
+JavaScript interop.
+
+Now that typical programs contain many fewer dynamic calls, perhaps it is time
+to make the calling convention for dynamic call different to that for instance
+method calls. One idea is we could start by making dynamic calls have a
+different selector. This selector would eventually be a fully-checked entry
+point, but initially it could just be an alias for the instance-call entry
+point. The alias could be a JavaScript Symbol, or for legacy browsers, always
+start with `dyn$`, even when minified.
+
+
+
diff --git a/pkg/compiler/tool/used_names/used_names.html b/pkg/compiler/tool/used_names/used_names.html
new file mode 100644
index 0000000..349c3c2
--- /dev/null
+++ b/pkg/compiler/tool/used_names/used_names.html
@@ -0,0 +1,6 @@
+<!--
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+-->
+<script src="used_names.js" defer></script>
diff --git a/pkg/compiler/tool/used_names/used_names.js b/pkg/compiler/tool/used_names/used_names.js
new file mode 100644
index 0000000..6d9c4c2
--- /dev/null
+++ b/pkg/compiler/tool/used_names/used_names.js
@@ -0,0 +1,55 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Script to find all short names used prototypes of global definitions. This
+// can be used as a basis for a list of names to avoid for dynamic method
+// selectors.
+//
+// TODO(7554): Update compiler regularly.
+
+function analyze() {
+ let names = Object.create(null)
+ for (var global of Object.getOwnPropertyNames(self)) {
+ let value = window[global];
+ if (typeof value != "function") continue;
+ let prototype = value.prototype;
+ if (prototype == null) continue;
+ while (prototype != null) {
+ for (let name of Object.getOwnPropertyNames(prototype)) {
+ if (name.length > 4) continue;
+ names[name] = 1;
+ }
+ prototype = Object.getPrototypeOf(prototype);
+ }
+ }
+
+ names = Object.keys(names);
+
+ function byLengthThenName(a, b) {
+ if (a.length != b.length) return a.length - b.length;
+ let a_lc = a.toLowerCase();
+ let b_lc = b.toLowerCase();
+ if (a_lc < b_lc) return -1;
+ if (a_lc > b_lc) return 1;
+ if (a > b) return -1;
+ if (a < b) return 1;
+ return 0;
+ }
+ names.sort(byLengthThenName);
+
+ return names;
+}
+
+function display(names) {
+ console.log(names)
+ let div = document.createElement('div');
+ document.body.appendChild(div);
+ div.style.fontFamily = 'courier'
+ for (let name of names) {
+ div.appendChild(document.createTextNode("'" + name + "',"))
+ div.appendChild(document.createElement("br"));
+ }
+}
+
+display(analyze());
diff --git a/pkg/dartdev/analysis_options.yaml b/pkg/dartdev/analysis_options.yaml
index 3faacee..094baf6 100644
--- a/pkg/dartdev/analysis_options.yaml
+++ b/pkg/dartdev/analysis_options.yaml
@@ -8,4 +8,5 @@
# Enable additional rules.
depend_on_referenced_packages: true
directives_ordering: true
+ prefer_single_quotes: true
sort_pub_dependencies: true
diff --git a/pkg/dartdev/lib/src/commands/doc.dart b/pkg/dartdev/lib/src/commands/doc.dart
index 11e1df7..907bba6 100644
--- a/pkg/dartdev/lib/src/commands/doc.dart
+++ b/pkg/dartdev/lib/src/commands/doc.dart
@@ -67,13 +67,13 @@
// At least one argument, the input directory, is required,
// when we're not generating docs for the Dart SDK.
if (args.rest.isEmpty) {
- usageException("Error: Input directory not specified");
+ usageException('Error: Input directory not specified');
}
// Determine input directory.
final dir = io.Directory(args.rest[0]);
if (!dir.existsSync()) {
- usageException("Error: Input directory doesn't exist: ${dir.path}");
+ usageException('Error: Input directory doesn\'t exist: ${dir.path}');
}
options.add('--input=${dir.path}');
}
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index ea0ce59..94b0141 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -20,7 +20,7 @@
import '../vm_interop_handler.dart';
class RunCommand extends DartdevCommand {
- static const bool isProductMode = bool.fromEnvironment("dart.vm.product");
+ static const bool isProductMode = bool.fromEnvironment('dart.vm.product');
static const String cmdName = 'run';
// kErrorExitCode, as defined in runtime/bin/error_exit.h
diff --git a/pkg/dartdev/test/no_such_file_test.dart b/pkg/dartdev/test/no_such_file_test.dart
index 1208a5e..4d8032d 100644
--- a/pkg/dartdev/test/no_such_file_test.dart
+++ b/pkg/dartdev/test/no_such_file_test.dart
@@ -33,7 +33,7 @@
expect(result.stderr, isNotEmpty);
expect(result.stderr, contains("Error when reading 'foo.dart':"));
expect(result.stdout, isNotEmpty);
- expect(result.stdout, contains("Info: Compiling with sound null safety\n"));
+ expect(result.stdout, contains('Info: Compiling with sound null safety\n'));
expect(result.exitCode, 254);
});
}
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index 25a4474..6e3e03e 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -18,10 +18,12 @@
void main() {
var baseArgs = <String>[];
final executableArgs = <String>[
- Platform.script.resolve('../../bin/dartdevc.dart').path,
+ Platform.script
+ .resolve('../../bin/dartdevc.dart')
+ .toFilePath(windows: Platform.isWindows),
'--sound-null-safety',
'--dart-sdk-summary',
- Uri.parse(Platform.resolvedExecutable)
+ Uri.file(Platform.resolvedExecutable, windows: Platform.isWindows)
.resolve('ddc_outline_sound.dill')
.path
];
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2aabaff..5e0c376 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1731,6 +1731,16 @@
}
}
+ // Setup scope first in two-step process:
+ // 1) Create a new SourceLibraryBuilder, add imports and setup (import)
+ // scope.
+ // 2) Create a new SourceLibraryBuilder, using a nested scope of the scope
+ // we just created as the scope. The import scopes have been setup via
+ // the parent chain.
+ // This is done to create the correct "layering" (i.e. definitions from
+ // the "self" library first, then imports while not having dill builders
+ // directly in the scope of a source builder (which can crash things in
+ // some circumstances).
SourceLibraryBuilder debugLibrary = new SourceLibraryBuilder(
importUri: libraryUri,
fileUri: debugExprUri,
@@ -1784,6 +1794,16 @@
debugLibrary.addImportsToScope();
_ticker.logMs("Added imports");
}
+ debugLibrary = new SourceLibraryBuilder(
+ importUri: libraryUri,
+ fileUri: debugExprUri,
+ packageLanguageVersion:
+ new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
+ loader: lastGoodKernelTarget.loader,
+ scope: debugLibrary.scope.createNestedScope("expression"),
+ nameOrigin: libraryBuilder,
+ isUnsupported: libraryBuilder.isUnsupported,
+ );
HybridFileSystem hfs =
lastGoodKernelTarget.fileSystem as HybridFileSystem;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 89b7847..e083a04 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1712,11 +1712,11 @@
}
List<Initializer>? initializers = _initializers;
- if (initializers != null) {
- if (libraryBuilder.enableSuperParametersInLibrary) {
- if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
- SuperInitializer superInitializer =
- initializers.last as SuperInitializer;
+ if (initializers != null && initializers.isNotEmpty) {
+ if (initializers.last is SuperInitializer) {
+ SuperInitializer superInitializer =
+ initializers.last as SuperInitializer;
+ if (libraryBuilder.enableSuperParametersInLibrary) {
Arguments arguments = superInitializer.arguments;
if (positionalSuperParametersAsArguments != null) {
@@ -1742,23 +1742,24 @@
arguments.named.addAll(namedSuperParametersAsArguments);
setParents(namedSuperParametersAsArguments, arguments);
}
-
- LocatedMessage? message = checkArgumentsForFunction(
- superInitializer.target.function,
- arguments,
- arguments.fileOffset, <TypeParameter>[]);
- if (message != null) {
- initializers[initializers.length - 1] = buildInvalidInitializer(
- buildUnresolvedError(
- forest.createNullLiteral(superInitializer.fileOffset),
- constructorNameForDiagnostics(
- superInitializer.target.name.text),
- arguments,
- superInitializer.fileOffset,
- isSuper: true,
- message: message,
- kind: UnresolvedKind.Constructor));
- }
+ } else if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+ initializers[initializers.length - 1] = buildInvalidInitializer(
+ buildProblem(fasta.messageEnumConstructorSuperInitializer,
+ superInitializer.fileOffset, noLength))
+ ..parent = constructor;
+ }
+ } else if (initializers.last is RedirectingInitializer) {
+ RedirectingInitializer redirectingInitializer =
+ initializers.last as RedirectingInitializer;
+ if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+ redirectingInitializer.arguments.positional.insertAll(0, [
+ new VariableGetImpl(constructor.function.positionalParameters[0],
+ forNullGuardedAccess: false)
+ ..parent = redirectingInitializer.arguments,
+ new VariableGetImpl(constructor.function.positionalParameters[1],
+ forNullGuardedAccess: false)
+ ..parent = redirectingInitializer.arguments
+ ]);
}
}
@@ -1775,41 +1776,11 @@
}
}
}
+
if (asyncModifier != AsyncMarker.Sync) {
constructor.initializers.add(buildInvalidInitializer(buildProblem(
fasta.messageConstructorNotSync, body!.fileOffset, noLength)));
}
- if (libraryBuilder.enableEnhancedEnumsInLibrary &&
- sourceClassBuilder is SourceEnumBuilder &&
- constructor.initializers.isNotEmpty &&
- constructor.initializers.last is RedirectingInitializer) {
- RedirectingInitializer redirectingInitializer =
- constructor.initializers.last as RedirectingInitializer;
- redirectingInitializer.arguments.positional.insertAll(0, [
- new VariableGet(constructor.function.positionalParameters[0])
- ..parent = redirectingInitializer.arguments,
- new VariableGet(constructor.function.positionalParameters[1])
- ..parent = redirectingInitializer.arguments
- ]);
-
- LocatedMessage? message = checkArgumentsForFunction(
- redirectingInitializer.target.function,
- redirectingInitializer.arguments,
- builder.charOffset, const <TypeParameter>[]);
- if (message != null) {
- Initializer invalidInitializer = buildInvalidInitializer(
- buildUnresolvedError(
- forest.createNullLiteral(redirectingInitializer.fileOffset),
- constructorNameForDiagnostics(builder.name, isSuper: false),
- redirectingInitializer.arguments,
- redirectingInitializer.fileOffset,
- isSuper: false,
- message: message,
- kind: UnresolvedKind.Constructor));
- constructor.initializers.removeLast();
- constructor.initializers.add(invalidInitializer..parent = constructor);
- }
- }
if (needsImplicitSuperInitializer) {
/// >If no superinitializer is provided, an implicit superinitializer
/// >of the form super() is added at the end of k’s initializer list,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ec5e04c..f1e283a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -3219,6 +3219,9 @@
messageAbstractClassConstructorTearOff,
nameOffset,
name.text.length);
+ } else if (declarationBuilder.cls.isEnum) {
+ return _helper.buildProblem(messageEnumConstructorTearoff,
+ nameOffset, name.text.length);
}
tearOffExpression = _helper.forest
.createConstructorTearOff(token.charOffset, tearOff);
@@ -4570,32 +4573,14 @@
int offset, Name name, Arguments arguments) {
Constructor? constructor =
_helper.lookupConstructor(name, isSuper: isSuper);
- LocatedMessage? message;
- if (constructor != null) {
- // The check of the arguments is done later for super initializers if the
- // 'super-parameters' language feature is enabled. In that case the
- // additional parameters can be added at a later stage.
- bool isPotentialSuperParametersReceiver =
- isSuper && _helper.libraryBuilder.enableSuperParametersInLibrary;
- // Additional arguments are added to the redirecting initializer of an
- // enum constructor, so the check is performed later.
- bool isEnumConstructorRedirectingInitializer =
- constructor.enclosingClass.isEnum;
- if (!isPotentialSuperParametersReceiver &&
- !isEnumConstructorRedirectingInitializer) {
- message = _helper.checkArgumentsForFunction(
- constructor.function, arguments, offset, <TypeParameter>[]);
- }
- } else {
+ if (constructor == null) {
String fullName =
_helper.constructorNameForDiagnostics(name.text, isSuper: isSuper);
- message = (isSuper
+ LocatedMessage message = (isSuper
? templateSuperclassHasNoConstructor
: templateConstructorNotFound)
.withArguments(fullName)
.withLocation(_uri, fileOffset, lengthForToken(token));
- }
- if (message != null) {
return _helper.buildInvalidInitializer(
_helper.buildUnresolvedError(
_forest.createNullLiteral(offset),
@@ -4609,10 +4594,10 @@
offset);
} else if (isSuper) {
return _helper.buildSuperInitializer(
- false, constructor!, arguments, offset);
+ false, constructor, arguments, offset);
} else {
return _helper.buildRedirectingInitializer(
- constructor!, arguments, offset);
+ constructor, arguments, offset);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index b5b8b97..878dc03b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -82,10 +82,39 @@
(canonicalMember.classBuilder != classBuilder &&
needsTypeOrCovarianceUpdate) ||
needMixinStub;
- bool needsSuperImpl = _superClassMember != null &&
- _superClassMember!
+ bool needsSuperImpl = false;
+ Member? superTarget;
+ if (_superClassMember != null) {
+ superTarget =
+ _superClassMember!.getMember(_combinedMemberSignature.membersBuilder);
+ if (superTarget is Procedure &&
+ interfaceMember is Procedure &&
+ (superTarget.function.positionalParameters.length <
+ interfaceMember.function.positionalParameters.length ||
+ superTarget.function.namedParameters.length <
+ interfaceMember.function.namedParameters.length)) {
+ // [superTarget] is not a valid implementation for [interfaceMember]
+ // since [interfaceMember] has more parameters than [superTarget].
+ //
+ // For instance
+ //
+ // class A {
+ // void method() {}
+ // }
+ // abstract class B<T> extends A {
+ // void method({T? a});
+ // }
+ //
+ // Any concrete implementation of B must provide its own implementation
+ // of `B.method` and cannot forward to `A.method`.
+ } else {
+ // [superTarget] is a valid implementation for [interfaceMember] so
+ // we need to add concrete forwarding stub of the variances differ.
+ needsSuperImpl = _superClassMember!
.getCovariance(_combinedMemberSignature.membersBuilder) !=
_combinedMemberSignature.combinedMemberSignatureCovariance;
+ }
+ }
if (stubNeeded) {
Procedure stub = _combinedMemberSignature.createMemberFromSignature(
copyLocation: false)!;
@@ -124,7 +153,7 @@
if (needsSuperImpl ||
(needMixinStub && _superClassMember == _mixedInMember)) {
_createForwardingImplIfNeeded(
- stub.function, stub.name, classBuilder.cls,
+ stub.function, stub.name, classBuilder.cls, superTarget,
isForwardingStub: needsForwardingStub);
}
}
@@ -136,16 +165,16 @@
.applyCovariance(interfaceMember);
}
if (needsSuperImpl) {
- _createForwardingImplIfNeeded(
- interfaceMember.function!, interfaceMember.name, classBuilder.cls,
+ _createForwardingImplIfNeeded(interfaceMember.function!,
+ interfaceMember.name, classBuilder.cls, superTarget,
isForwardingStub: true);
}
return null;
}
}
- void _createForwardingImplIfNeeded(
- FunctionNode function, Name name, Class enclosingClass,
+ void _createForwardingImplIfNeeded(FunctionNode function, Name name,
+ Class enclosingClass, Member? superTarget,
{required bool isForwardingStub}) {
// ignore: unnecessary_null_comparison
assert(isForwardingStub != null);
@@ -155,12 +184,10 @@
}
// If there is no concrete implementation in the superclass, then the method
// is fully abstract and we don't need to do anything.
- if (_superClassMember == null) {
+ if (superTarget == null) {
return;
}
Procedure procedure = function.parent as Procedure;
- Member superTarget =
- _superClassMember!.getMember(_combinedMemberSignature.membersBuilder);
if (superTarget is Procedure && superTarget.isForwardingStub) {
Procedure superProcedure = superTarget;
superTarget = superProcedure.concreteForwardingStubTarget!;
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
index 8b331c0..1cd915d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -344,6 +344,7 @@
isAbstract: builder.isAbstract,
isExternal: builder.isExternal,
isGetter: builder.isGetter,
+ isOperator: builder.isOperator,
isSetter: builder.isSetter,
positionalParameters: positionalParameters,
namedParameters: namedParameters,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 50fad75..4d8edad 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -952,24 +952,29 @@
return;
}
- // Check whether [redirecteeType] <: [factoryType].
- if (!typeEnvironment.isSubtypeOf(
- redirecteeType, factoryType, SubtypeCheckMode.ignoringNullabilities)) {
- _addProblemForRedirectingFactory(
- factory,
- templateIncompatibleRedirecteeFunctionType.withArguments(
- redirecteeType, factoryType, library.isNonNullableByDefault),
- factory.redirectionTarget.charOffset,
- noLength);
- } else if (library.isNonNullableByDefault) {
- if (!typeEnvironment.isSubtypeOf(
- redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
+ // Redirection to generative enum constructors is forbidden and is reported
+ // as an error elsewhere.
+ if (!(cls.isEnum &&
+ (factory.redirectionTarget.target?.isConstructor ?? false))) {
+ // Check whether [redirecteeType] <: [factoryType].
+ if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType,
+ SubtypeCheckMode.ignoringNullabilities)) {
_addProblemForRedirectingFactory(
factory,
templateIncompatibleRedirecteeFunctionType.withArguments(
redirecteeType, factoryType, library.isNonNullableByDefault),
factory.redirectionTarget.charOffset,
noLength);
+ } else if (library.isNonNullableByDefault) {
+ if (!typeEnvironment.isSubtypeOf(
+ redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
+ _addProblemForRedirectingFactory(
+ factory,
+ templateIncompatibleRedirecteeFunctionType.withArguments(
+ redirecteeType, factoryType, library.isNonNullableByDefault),
+ factory.redirectionTarget.charOffset,
+ noLength);
+ }
}
}
}
@@ -1690,6 +1695,16 @@
noLength);
targetNode = null;
}
+ if (targetNode != null &&
+ targetNode is Constructor &&
+ targetNode.enclosingClass.isEnum) {
+ _addProblemForRedirectingFactory(
+ declaration,
+ messageEnumFactoryRedirectsToConstructor,
+ redirectionTarget.charOffset,
+ noLength);
+ targetNode = null;
+ }
if (targetNode != null) {
List<DartType> typeArguments = declaration.typeArguments ??
new List<DartType>.filled(
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 8f7cfc8..27e2e0e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -21,16 +21,17 @@
import '../builder/type_variable_builder.dart';
import '../constant_context.dart' show ConstantContext;
import '../dill/dill_member_builder.dart';
+import '../identifiers.dart';
import '../kernel/body_builder.dart' show BodyBuilder;
import '../kernel/constructor_tearoff_lowering.dart';
-import '../kernel/expression_generator_helper.dart'
- show ExpressionGeneratorHelper;
+import '../kernel/expression_generator_helper.dart';
import '../kernel/hierarchy/class_member.dart' show ClassMember;
import '../kernel/kernel_helper.dart' show SynthesizedFunctionNode;
import '../kernel/utils.dart'
show isRedirectingGenerativeConstructorImplementation;
import '../messages.dart'
show
+ LocatedMessage,
Message,
messageMoreThanOneSuperInitializer,
messageRedirectingConstructorWithAnotherInitializer,
@@ -83,6 +84,12 @@
@override
List<FormalParameterBuilder>? formals;
+ @override
+ String get fullNameForErrors {
+ return "${flattenName(classBuilder.name, charOffset, fileUri)}"
+ "${name.isEmpty ? '' : '.$name'}";
+ }
+
DeclaredSourceConstructorBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
@@ -523,8 +530,27 @@
helper);
} else {
inferenceResult?.applyResult(initializers, _constructor);
- initializers.add(initializer..parent = _constructor);
superInitializer = initializer;
+
+ LocatedMessage? message = helper.checkArgumentsForFunction(
+ initializer.target.function,
+ initializer.arguments,
+ initializer.arguments.fileOffset, <TypeParameter>[]);
+ if (message != null) {
+ initializers.add(helper.buildInvalidInitializer(
+ helper.buildUnresolvedError(
+ helper.forest.createNullLiteral(initializer.fileOffset),
+ helper.constructorNameForDiagnostics(
+ initializer.target.name.text),
+ initializer.arguments,
+ initializer.fileOffset,
+ isSuper: true,
+ message: message,
+ kind: UnresolvedKind.Constructor))
+ ..parent = _constructor);
+ } else {
+ initializers.add(initializer..parent = _constructor);
+ }
}
} else if (initializer is RedirectingInitializer) {
if (superInitializer != null) {
@@ -559,8 +585,28 @@
redirectingInitializer = initializer;
} else {
inferenceResult?.applyResult(initializers, _constructor);
- initializers.add(initializer..parent = _constructor);
redirectingInitializer = initializer;
+
+ LocatedMessage? message = helper.checkArgumentsForFunction(
+ initializer.target.function,
+ initializer.arguments,
+ initializer.arguments.fileOffset, const <TypeParameter>[]);
+ if (message != null) {
+ initializers.add(helper.buildInvalidInitializer(
+ helper.buildUnresolvedError(
+ helper.forest.createNullLiteral(initializer.fileOffset),
+ helper.constructorNameForDiagnostics(
+ initializer.target.name.text,
+ isSuper: false),
+ initializer.arguments,
+ initializer.fileOffset,
+ isSuper: false,
+ message: message,
+ kind: UnresolvedKind.Constructor))
+ ..parent = _constructor);
+ } else {
+ initializers.add(initializer..parent = _constructor);
+ }
}
} else if (redirectingInitializer != null) {
int length = noLength;
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 093c77c..b6040af 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -28,6 +28,7 @@
show
LocatedMessage,
messageEnumEntryWithTypeArgumentsWithoutArguments,
+ messageEnumNonConstConstructor,
messageNoUnnamedConstructorInObject,
noLength,
templateDuplicatedDeclaration,
@@ -36,6 +37,7 @@
templateEnumConstantSameNameAsEnclosing;
import '../kernel/body_builder.dart';
+import '../kernel/constness.dart';
import '../kernel/constructor_tearoff_lowering.dart';
import '../kernel/expression_generator_helper.dart';
import '../kernel/kernel_helper.dart';
@@ -83,6 +85,7 @@
this.objectType,
this.stringType,
SourceLibraryBuilder parent,
+ List<ConstructorReferenceBuilder> constructorReferences,
int startCharOffset,
int charOffset,
int charEndOffset,
@@ -98,7 +101,7 @@
scope,
constructors,
parent,
- /* constructorReferences = */ null,
+ constructorReferences,
startCharOffset,
charOffset,
charEndOffset,
@@ -113,6 +116,7 @@
List<TypeBuilder>? interfaceBuilders,
List<EnumConstantInfo?>? enumConstantInfos,
SourceLibraryBuilder parent,
+ List<ConstructorReferenceBuilder> constructorReferences,
int startCharOffset,
int charOffset,
int charEndOffset,
@@ -420,6 +424,7 @@
objectType,
stringType,
parent,
+ constructorReferences,
startCharOffsetComputed,
charOffset,
charEndOffset,
@@ -435,8 +440,18 @@
}
members.forEach(setParent);
- constructors.forEach(setParent);
+ constructorScope.local.forEach(setParent);
selfType.bind(enumBuilder);
+
+ if (constructorScope.local.isNotEmpty) {
+ for (MemberBuilder constructorBuilder in constructorScope.local.values) {
+ if (!constructorBuilder.isFactory && !constructorBuilder.isConst) {
+ parent.addProblem(messageEnumNonConstConstructor,
+ constructorBuilder.charOffset, noLength, fileUri);
+ }
+ }
+ }
+
return enumBuilder;
}
@@ -590,12 +605,13 @@
}
}
BodyBuilder? bodyBuilder;
- if (enumConstantInfo.argumentsBeginToken != null ||
- typeArgumentBuilders == null && cls.typeParameters.isNotEmpty) {
- // We need to create a BodyBuilder in two cases: 1) if the
- // arguments token is provided, we'll use the BodyBuilder to
+ if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+ // We need to create a BodyBuilder to solve the following: 1) if
+ // the arguments token is provided, we'll use the BodyBuilder to
// parse them and perform inference, 2) if the type arguments
- // aren't provided, but required, we'll use it to infer them.
+ // aren't provided, but required, we'll use it to infer them, and
+ // 3) in case of erroneous code the constructor invocation should
+ // be built via a body builder to detect potential errors.
bodyBuilder = library.loader.createBodyBuilderForOutlineExpression(
library, this, this, scope, fileUri);
bodyBuilder.constantContext = ConstantContext.required;
@@ -622,13 +638,9 @@
if (constructorBuilder == null ||
constructorBuilder is! SourceConstructorBuilder) {
- bodyBuilder ??= library.loader
- .createBodyBuilderForOutlineExpression(
- library, this, this, scope, fileUri)
- ..constantContext = ConstantContext.required;
field.buildBody(
classHierarchy.coreTypes,
- bodyBuilder.buildUnresolvedError(
+ bodyBuilder!.buildUnresolvedError(
new NullLiteral(),
enumConstantInfo
.constructorReferenceBuilder?.fullNameForErrors ??
@@ -638,16 +650,23 @@
enumConstantInfo.charOffset,
kind: UnresolvedKind.Constructor));
} else {
- Expression initializer = new ConstructorInvocation(
- constructorBuilder.constructor, arguments,
- isConst: true)
- ..fileOffset = field.charOffset;
+ Expression initializer;
if (bodyBuilder != null) {
+ initializer = bodyBuilder.buildStaticInvocation(
+ constructorBuilder.constructor, arguments,
+ constness: Constness.explicitConst,
+ charOffset: field.charOffset);
ExpressionInferenceResult inferenceResult =
bodyBuilder.typeInferrer.inferFieldInitializer(
bodyBuilder, const UnknownType(), initializer);
initializer = inferenceResult.expression;
+ if (initializer is ConstructorInvocation) {}
field.fieldType = inferenceResult.inferredType;
+ } else {
+ initializer = new ConstructorInvocation(
+ constructorBuilder.constructor, arguments,
+ isConst: true)
+ ..fileOffset = field.charOffset;
}
field.buildBody(classHierarchy.coreTypes, initializer);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index a0bf299..dee61c4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2820,6 +2820,7 @@
interfaceBuilders,
enumConstantInfos,
this,
+ new List<ConstructorReferenceBuilder>.of(constructorReferences),
startCharOffset,
charOffset,
charEndOffset,
@@ -2831,6 +2832,7 @@
debugName: "enum $name",
isModifiable: false),
new ConstructorScope(name, constructors));
+ constructorReferences.clear();
Map<String, TypeVariableBuilder>? typeVariablesByName =
checkTypeVariables(typeVariables, enumBuilder);
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 74da302..7be3d9c 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -213,13 +213,21 @@
DuplicatedParameterName/example: Fail
Encoding/analyzerCode: Fail
EnumConstantSameNameAsEnclosing/example: Fail
+EnumConstructorSuperInitializer/analyzerCode: Fail
+EnumConstructorSuperInitializer/example: Fail
+EnumConstructorTearoff/analyzerCode: Fail
+EnumConstructorTearoff/example: Fail
EnumDeclaresConstFactory/analyzerCode: Fail
EnumDeclaresConstFactory/example: Fail
EnumDeclaresFactory/analyzerCode: Fail
EnumDeclaresFactory/example: Fail
EnumEntryWithTypeArgumentsWithoutArguments/analyzerCode: Fail
EnumEntryWithTypeArgumentsWithoutArguments/example: Fail
+EnumFactoryRedirectsToConstructor/analyzerCode: Fail
+EnumFactoryRedirectsToConstructor/example: Fail
EnumInstantiation/example: Fail
+EnumNonConstConstructor/analyzerCode: Fail
+EnumNonConstConstructor/example: Fail
EnumSupertypeOfNonAbstractClass/analyzerCode: Fail
EnumSupertypeOfNonAbstractClass/example: Fail
EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 67467be..5fdadc6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5461,3 +5461,15 @@
EnumEntryWithTypeArgumentsWithoutArguments:
problemMessage: "Missing arguments in enum constructor invocation."
+
+EnumNonConstConstructor:
+ problemMessage: "Generative enum constructors must be marked as 'const'."
+
+EnumConstructorSuperInitializer:
+ problemMessage: "Enum constructors can't contain super-initializers."
+
+EnumConstructorTearoff:
+ problemMessage: "Enum constructors can't be torn off."
+
+EnumFactoryRedirectsToConstructor:
+ problemMessage: "Enum factory constructors can't redirect to generative constructors."
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart
new file mode 100644
index 0000000..e92c5b9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart
@@ -0,0 +1,13 @@
+void main() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ on();
+}
+
+void on() {}
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect
new file mode 100644
index 0000000..0914f09
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(on, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(on, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(}, null)
+ handleVoidKeyword(void)
+ handleIdentifier(on, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ endBlockFunctionBody(0, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect
new file mode 100644
index 0000000..978a69c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect
@@ -0,0 +1,147 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ inPlainSync()
+ parseSendOrFunctionLiteral(}, expression)
+ looksLikeFunctionBody(;)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ inPlainSync()
+ listener: handleIdentifier(on, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(on)
+ parseArguments(on)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(on, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, on, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(on, topLevelFunctionDeclaration)
+ parseMethodTypeVar(on)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(on, on, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(on, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(0, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect
new file mode 100644
index 0000000..ae4a8fa
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on();
+}
+
+void on() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] on[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect
new file mode 100644
index 0000000..ae4a8fa
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on();
+}
+
+void on() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] on[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info
new file mode 100644
index 0000000..7e10e9d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info
@@ -0,0 +1,5 @@
+files:
+ - call_on_after_try_block.dart
+ - call_on_after_try_block_prime.dart
+filters:
+ - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart
new file mode 100644
index 0000000..1809732
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart
@@ -0,0 +1,15 @@
+void main() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ on(e) {
+ ;
+ }
+ on("");
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect
new file mode 100644
index 0000000..6cd22a5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect
@@ -0,0 +1,76 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ beginMetadataStar(on)
+ endMetadataStar(0)
+ handleNoTypeVariables(()
+ beginLocalFunctionDeclaration(on)
+ handleNoType(})
+ beginFunctionName(on)
+ handleIdentifier(on, localFunctionDeclaration)
+ endFunctionName(on, ()
+ beginFormalParameters((, MemberKind.Local)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Local, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+ endFormalParameters(1, (, ), MemberKind.Local)
+ handleNoInitializers()
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleEmptyStatement(;)
+ endBlockFunctionBody(1, {, })
+ endLocalFunctionDeclaration(})
+ handleIdentifier(on, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString("")
+ endLiteralString(0, ))
+ endArguments(1, (, ))
+ handleSend(on, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(3, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect
new file mode 100644
index 0000000..c86c3bb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect
@@ -0,0 +1,175 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ listener: beginMetadataStar(on)
+ listener: endMetadataStar(0)
+ listener: handleNoTypeVariables(()
+ listener: beginLocalFunctionDeclaration(on)
+ listener: handleNoType(})
+ parseNamedFunctionRest(}, on, on, false)
+ listener: beginFunctionName(on)
+ ensureIdentifier(}, localFunctionDeclaration)
+ inPlainSync()
+ listener: handleIdentifier(on, localFunctionDeclaration)
+ listener: endFunctionName(on, ()
+ parseFormalParametersRequiredOpt(on, MemberKind.Local)
+ parseFormalParametersRest((, MemberKind.Local)
+ listener: beginFormalParameters((, MemberKind.Local)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Local)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Local, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+ listener: endFormalParameters(1, (, ), MemberKind.Local)
+ parseInitializersOpt())
+ listener: handleNoInitializers()
+ parseAsyncOptBody(), false, false)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endLocalFunctionDeclaration(})
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ inPlainSync()
+ parseSendOrFunctionLiteral(}, expression)
+ looksLikeFunctionBody(;)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ inPlainSync()
+ listener: handleIdentifier(on, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(on)
+ parseArguments(on)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString("")
+ listener: endLiteralString(0, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(on, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(3, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect
new file mode 100644
index 0000000..0966333
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on(e) {
+;
+}
+on("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect
new file mode 100644
index 0000000..0966333
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on(e) {
+;
+}
+on("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info
new file mode 100644
index 0000000..66ae9f7
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info
@@ -0,0 +1,5 @@
+files:
+ - call_on_after_try_block2.dart
+ - call_on_after_try_block2_prime.dart
+filters:
+ - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart
new file mode 100644
index 0000000..6545ea2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart
@@ -0,0 +1,15 @@
+void main() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ onX(e) {
+ ;
+ }
+ onX("");
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect
new file mode 100644
index 0000000..42b2c0f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect
@@ -0,0 +1,76 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ beginMetadataStar(onX)
+ endMetadataStar(0)
+ handleNoTypeVariables(()
+ beginLocalFunctionDeclaration(onX)
+ handleNoType(})
+ beginFunctionName(onX)
+ handleIdentifier(onX, localFunctionDeclaration)
+ endFunctionName(onX, ()
+ beginFormalParameters((, MemberKind.Local)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Local, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+ endFormalParameters(1, (, ), MemberKind.Local)
+ handleNoInitializers()
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleEmptyStatement(;)
+ endBlockFunctionBody(1, {, })
+ endLocalFunctionDeclaration(})
+ handleIdentifier(onX, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString("")
+ endLiteralString(0, ))
+ endArguments(1, (, ))
+ handleSend(onX, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(3, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect
new file mode 100644
index 0000000..1f1b263
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect
@@ -0,0 +1,170 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ listener: beginMetadataStar(onX)
+ listener: endMetadataStar(0)
+ listener: handleNoTypeVariables(()
+ listener: beginLocalFunctionDeclaration(onX)
+ listener: handleNoType(})
+ parseNamedFunctionRest(}, onX, onX, false)
+ listener: beginFunctionName(onX)
+ ensureIdentifier(}, localFunctionDeclaration)
+ listener: handleIdentifier(onX, localFunctionDeclaration)
+ listener: endFunctionName(onX, ()
+ parseFormalParametersRequiredOpt(onX, MemberKind.Local)
+ parseFormalParametersRest((, MemberKind.Local)
+ listener: beginFormalParameters((, MemberKind.Local)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Local)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Local, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+ listener: endFormalParameters(1, (, ), MemberKind.Local)
+ parseInitializersOpt())
+ listener: handleNoInitializers()
+ parseAsyncOptBody(), false, false)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endLocalFunctionDeclaration(})
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ parseSendOrFunctionLiteral(}, expression)
+ looksLikeFunctionBody(;)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ listener: handleIdentifier(onX, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(onX)
+ parseArguments(onX)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString("")
+ listener: endLiteralString(0, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(onX, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(3, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect
new file mode 100644
index 0000000..d3fb703
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX(e) {
+;
+}
+onX("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect
new file mode 100644
index 0000000..d3fb703
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX(e) {
+;
+}
+onX("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart
new file mode 100644
index 0000000..802f69e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ on.toString();
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect
new file mode 100644
index 0000000..b7e4845
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(on)
+ handleType(int, null)
+ handleIdentifier(on, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(on, expression)
+ handleNoTypeArguments(.)
+ handleNoArguments(.)
+ handleSend(on, .)
+ handleIdentifier(toString, expressionContinuation)
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(toString, ;)
+ handleEndingBinaryExpression(.)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect
new file mode 100644
index 0000000..a976a69
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect
@@ -0,0 +1,144 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(on)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ inPlainSync()
+ listener: handleIdentifier(on, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ inPlainSync()
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ inPlainSync()
+ listener: handleIdentifier(on, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(on)
+ listener: handleNoArguments(.)
+ listener: handleSend(on, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ looksLikeFunctionBody(;)
+ parseSend(., expressionContinuation)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(toString, expressionContinuation)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(toString)
+ parseArguments(toString)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(toString, ;)
+ listener: handleEndingBinaryExpression(.)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect
new file mode 100644
index 0000000..3b86aa5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect
new file mode 100644
index 0000000..3b86aa5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info
new file mode 100644
index 0000000..313a263
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info
@@ -0,0 +1,5 @@
+files:
+ - call_on_after_try_block3.dart
+ - call_on_after_try_block3_prime.dart
+filters:
+ - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart
new file mode 100644
index 0000000..d01b2e8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ onX.toString();
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect
new file mode 100644
index 0000000..c26e870
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(onX)
+ handleType(int, null)
+ handleIdentifier(onX, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(onX, expression)
+ handleNoTypeArguments(.)
+ handleNoArguments(.)
+ handleSend(onX, .)
+ handleIdentifier(toString, expressionContinuation)
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(toString, ;)
+ handleEndingBinaryExpression(.)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect
new file mode 100644
index 0000000..cf7a142
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect
@@ -0,0 +1,140 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(onX)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(onX, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ listener: handleIdentifier(onX, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(onX)
+ listener: handleNoArguments(.)
+ listener: handleSend(onX, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ looksLikeFunctionBody(;)
+ parseSend(., expressionContinuation)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(toString, expressionContinuation)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(toString)
+ parseArguments(toString)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(toString, ;)
+ listener: handleEndingBinaryExpression(.)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect
new file mode 100644
index 0000000..a96a920
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect
new file mode 100644
index 0000000..a96a920
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart
new file mode 100644
index 0000000..3f71e09
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ on = 42;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect
new file mode 100644
index 0000000..52112c9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect
@@ -0,0 +1,61 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(on)
+ handleType(int, null)
+ handleIdentifier(on, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(on, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(on, =)
+ handleLiteralInt(42)
+ handleAssignmentExpression(=)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect
new file mode 100644
index 0000000..6735307
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect
@@ -0,0 +1,135 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(on)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ inPlainSync()
+ listener: handleIdentifier(on, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ inPlainSync()
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ inPlainSync()
+ listener: handleIdentifier(on, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(on)
+ listener: handleNoArguments(=)
+ listener: handleSend(on, =)
+ parsePrecedenceExpression(=, 1, true)
+ parseUnaryExpression(=, true)
+ parsePrimary(=, expression)
+ parseLiteralInt(=)
+ listener: handleLiteralInt(42)
+ listener: handleAssignmentExpression(=)
+ ensureSemicolon(42)
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect
new file mode 100644
index 0000000..0af7587
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect
new file mode 100644
index 0000000..0af7587
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info
new file mode 100644
index 0000000..23cbacc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info
@@ -0,0 +1,5 @@
+files:
+ - call_on_after_try_block4.dart
+ - call_on_after_try_block4_prime.dart
+filters:
+ - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart
new file mode 100644
index 0000000..7e56a69
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ onX = 42;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect
new file mode 100644
index 0000000..0df2227
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect
@@ -0,0 +1,61 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(onX)
+ handleType(int, null)
+ handleIdentifier(onX, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(onX, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(onX, =)
+ handleLiteralInt(42)
+ handleAssignmentExpression(=)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect
new file mode 100644
index 0000000..869a099
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect
@@ -0,0 +1,131 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(onX)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(onX, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ listener: handleIdentifier(onX, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(onX)
+ listener: handleNoArguments(=)
+ listener: handleSend(onX, =)
+ parsePrecedenceExpression(=, 1, true)
+ parseUnaryExpression(=, true)
+ parsePrimary(=, expression)
+ parseLiteralInt(=)
+ listener: handleLiteralInt(42)
+ listener: handleAssignmentExpression(=)
+ ensureSemicolon(42)
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect
new file mode 100644
index 0000000..0b125f4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect
new file mode 100644
index 0000000..0b125f4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart
new file mode 100644
index 0000000..eeac09a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ on;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect
new file mode 100644
index 0000000..c639d14
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect
@@ -0,0 +1,59 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(on)
+ handleType(int, null)
+ handleIdentifier(on, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(on, expression)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(on, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect
new file mode 100644
index 0000000..93c805d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect
@@ -0,0 +1,129 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(on)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ inPlainSync()
+ listener: handleIdentifier(on, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, on)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclaration(}, false)
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(on)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ inPlainSync()
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ inPlainSync()
+ listener: handleIdentifier(on, expression)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(on)
+ listener: handleNoArguments(;)
+ listener: handleSend(on, ;)
+ ensureSemicolon(on)
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect
new file mode 100644
index 0000000..5e272ff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect
new file mode 100644
index 0000000..5e272ff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info
new file mode 100644
index 0000000..39d6b9d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info
@@ -0,0 +1,5 @@
+files:
+ - call_on_after_try_block5.dart
+ - call_on_after_try_block5_prime.dart
+filters:
+ - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart
new file mode 100644
index 0000000..8bd11f3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ onX;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect
new file mode 100644
index 0000000..95a5d34
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect
@@ -0,0 +1,59 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(onX)
+ handleType(int, null)
+ handleIdentifier(onX, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(onX, expression)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(onX, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect
new file mode 100644
index 0000000..ac6aa6d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect
@@ -0,0 +1,125 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(onX)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(onX, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ parseSendOrFunctionLiteral(}, expression)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ listener: handleIdentifier(onX, expression)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(onX)
+ listener: handleNoArguments(;)
+ listener: handleSend(onX, ;)
+ ensureSemicolon(onX)
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect
new file mode 100644
index 0000000..f75602b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect
new file mode 100644
index 0000000..f75602b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart
new file mode 100644
index 0000000..4313b11
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart
@@ -0,0 +1,13 @@
+void main() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ onX();
+}
+
+void onX() {}
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect
new file mode 100644
index 0000000..634138f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginTryStatement(try)
+ beginBlock({, BlockKind(try statement))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(try statement))
+ beginCatchClause(catch)
+ beginFormalParameters((, MemberKind.Catch)
+ beginMetadataStar(e)
+ endMetadataStar(0)
+ beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ handleNoType(()
+ handleIdentifier(e, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ endFormalParameters(1, (, ), MemberKind.Catch)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(null, catch, null)
+ beginCatchClause(on)
+ handleIdentifier(Foo, typeReference)
+ handleNoTypeArguments({)
+ handleType(Foo, null)
+ endCatchClause({)
+ beginBlock({, BlockKind(catch clause))
+ handleEmptyStatement(;)
+ endBlock(1, {, }, BlockKind(catch clause))
+ handleCatchBlock(on, null, null)
+ endTryStatement(2, try, null)
+ handleIdentifier(onX, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(onX, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(}, null)
+ handleVoidKeyword(void)
+ handleIdentifier(onX, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ endBlockFunctionBody(0, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect
new file mode 100644
index 0000000..c48756b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect
@@ -0,0 +1,144 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, try)
+ parseStatement({)
+ parseStatementX({)
+ parseTryStatement({)
+ listener: beginTryStatement(try)
+ parseBlock(try, BlockKind(try statement))
+ ensureBlock(try, null, try statement)
+ listener: beginBlock({, BlockKind(try statement))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(try statement))
+ listener: beginCatchClause(catch)
+ parseFormalParameters(catch, MemberKind.Catch)
+ parseFormalParametersRest((, MemberKind.Catch)
+ listener: beginFormalParameters((, MemberKind.Catch)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+ parseMetadataStar(()
+ listener: beginMetadataStar(e)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+ listener: handleNoType(()
+ ensureIdentifier((, formalParameterDeclaration)
+ listener: handleIdentifier(e, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+ listener: endFormalParameters(1, (, ), MemberKind.Catch)
+ listener: endCatchClause({)
+ parseBlock(), BlockKind(catch clause))
+ ensureBlock(), null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(null, catch, null)
+ listener: beginCatchClause(on)
+ listener: handleIdentifier(Foo, typeReference)
+ listener: handleNoTypeArguments({)
+ listener: handleType(Foo, null)
+ listener: endCatchClause({)
+ parseBlock(Foo, BlockKind(catch clause))
+ ensureBlock(Foo, null, catch clause)
+ listener: beginBlock({, BlockKind(catch clause))
+ notEofOrValue(}, ;)
+ parseStatement({)
+ parseStatementX({)
+ parseEmptyStatement({)
+ listener: handleEmptyStatement(;)
+ notEofOrValue(}, })
+ listener: endBlock(1, {, }, BlockKind(catch clause))
+ listener: handleCatchBlock(on, null, null)
+ listener: endTryStatement(2, try, null)
+ notEofOrValue(}, onX)
+ parseStatement(})
+ parseStatementX(})
+ parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+ looksLikeLocalFunction(onX)
+ parseExpressionStatement(})
+ parseExpression(})
+ parsePrecedenceExpression(}, 1, true)
+ parseUnaryExpression(}, true)
+ parsePrimary(}, expression)
+ parseSendOrFunctionLiteral(}, expression)
+ looksLikeFunctionBody(;)
+ parseSend(}, expression)
+ isNextIdentifier(})
+ ensureIdentifier(}, expression)
+ listener: handleIdentifier(onX, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(onX)
+ parseArguments(onX)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(onX, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, onX, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(onX, topLevelFunctionDeclaration)
+ parseMethodTypeVar(onX)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(onX, onX, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(onX, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(0, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect
new file mode 100644
index 0000000..cb01c79
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX();
+}
+
+void onX() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] onX[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect
new file mode 100644
index 0000000..cb01c79
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX();
+}
+
+void onX() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] onX[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
index ff31d86..7b57f38 100644
--- a/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
+++ b/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
@@ -40,9 +40,8 @@
FutureOr<void> buildTypesForFunction(
FunctionDeclaration function, TypeBuilder builder) {
- builder.declareType(new DeclarationCode.fromString('''
-class ${function.identifier.name}GeneratedClass {}
-'''));
+ var name = '${function.identifier.name}GeneratedClass';
+ builder.declareType(name, new DeclarationCode.fromString('class $name {}'));
}
}
diff --git a/pkg/front_end/test/macro_application/data/tests/types.dart b/pkg/front_end/test/macro_application/data/tests/types.dart
index c10a353..1d8ce17 100644
--- a/pkg/front_end/test/macro_application/data/tests/types.dart
+++ b/pkg/front_end/test/macro_application/data/tests/types.dart
@@ -6,12 +6,10 @@
@FunctionTypesMacro1()
/*member: topLevelFunction1:
-class topLevelFunction1GeneratedClass {}
-*/
+class topLevelFunction1GeneratedClass {}*/
void topLevelFunction1() {}
@FunctionTypesMacro1()
/*member: topLevelFunction2:
-class topLevelFunction2GeneratedClass {}
-*/
+class topLevelFunction2GeneratedClass {}*/
void topLevelFunction2() {}
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index 1bedb08..c4db330 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -387,5 +387,10 @@
Iterable<DeclarationCode> augmentations = const [];
@override
- void serialize(Serializer serializer) {}
+ Iterable<String> newTypeNames = const [];
+
+ @override
+ void serialize(Serializer serializer) {
+ throw UnimplementedError();
+ }
}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index ca447e7..2fe783e 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -90,6 +90,7 @@
backping
backstop
badly
+bail
bang
bar
basically
@@ -670,6 +671,7 @@
launcher
layer
layered
+layering
layers
layout
lc
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index d69db07..6e70064 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1249,6 +1249,7 @@
follows
food
for
+forbidden
force
forced
forest
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart
new file mode 100644
index 0000000..b2719d2
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E {
+ one, // Ok.
+ two.named(), // Ok.
+ three.f(), // Error.
+ four.f2(); // Error.
+
+ const E();
+
+ const E.named()
+ : this(); // Ok.
+
+ factory E.f() => values.first;
+
+ factory E.f2() {
+ return const E(); // Error.
+ }
+
+ const factory E.f3() = E; // Error.
+
+ factory E.f4() = E; // Error.
+
+ factory E.f5() = E.f; // Ok.
+
+ factory E.f6(int value) = E.f; // Error.
+}
+
+test() {
+ new E(); // Error.
+ const E(); // Error.
+ E.new; // Error.
+
+ new E.named(); // Error.
+ const E().named(); // Error.
+ E.named; // Error.
+
+ new E.f(); // Ok.
+ const E.f(); // Error.
+ E.f; // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+// return const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+// new E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+// const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+// E.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+// new E.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+// const E().named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+// E.named; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const E.f(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E one = #C3;
+ static const field self::E two = #C6;
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^".{core::Iterable::first}{self::E};
+ static factory f2() → self::E {
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+ return const E(); // Error.
+ ^";
+ }
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic {
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+ new E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+ const E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+ E.new; // Error.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+ new E.named(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+ const E().named(); // Error.
+ ^"{dynamic}.named();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+ E.named; // Error.
+ ^^^^^";
+ self::E::f();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ const E.f(); // Error.
+ ^";
+ #C11;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E {index:#C4, _name:#C5}
+ #C7 = constructor-tearoff self::E::f3
+ #C8 = constructor-tearoff self::E::f4
+ #C9 = constructor-tearoff self::E::f5
+ #C10 = constructor-tearoff self::E::f6
+ #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+// return const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+// new E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+// const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+// E.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+// new E.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+// const E().named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+// E.named; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const E.f(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E one = #C3;
+ static const field self::E two = #C6;
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^".{core::Iterable::first}{self::E};
+ static factory f2() → self::E {
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+ return const E(); // Error.
+ ^";
+ }
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic {
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+ new E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+ const E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+ E.new; // Error.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+ new E.named(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+ const E().named(); // Error.
+ ^"{dynamic}.named();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+ E.named; // Error.
+ ^^^^^";
+ self::E::f();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ const E.f(); // Error.
+ ^";
+ #C11;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E {index:#C4, _name:#C5}
+ #C7 = constructor-tearoff self::E::f3
+ #C8 = constructor-tearoff self::E::f4
+ #C9 = constructor-tearoff self::E::f5
+ #C10 = constructor-tearoff self::E::f6
+ #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect
new file mode 100644
index 0000000..672888e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E { one, two.named(), three.f(), four.f2(); const E(); const E.named() : this(); factory E.f() => values.first; factory E.f2() { return const E(); } const factory E.f3() = E; factory E.f4() = E; factory E.f5() = E.f; factory E.f6(int value) = E.f; }
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+// return const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+// new E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+// const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+// E.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+// new E.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+// const E().named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+// E.named; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const E.f(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E one = #C3;
+ static const field self::E two = #C6;
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^".{core::Iterable::first}{self::E};
+ static factory f2() → self::E {
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+ return const E(); // Error.
+ ^";
+ }
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic {
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+ new E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+ const E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+ E.new; // Error.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+ new E.named(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+ const E().named(); // Error.
+ ^"{dynamic}.named();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+ E.named; // Error.
+ ^^^^^";
+ self::E::f();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ const E.f(); // Error.
+ ^";
+ #C11;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E {index:#C4, _name:#C5}
+ #C7 = constructor-tearoff self::E::f3
+ #C8 = constructor-tearoff self::E::f4
+ #C9 = constructor-tearoff self::E::f5
+ #C10 = constructor-tearoff self::E::f6
+ #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+// return const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+// new E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+// const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+// E.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+// new E.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+// const E().named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+// E.named; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const E.f(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E one = #C3;
+ static const field self::E two = #C6;
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^".{core::Iterable::first}{self::E};
+ static factory f2() → self::E {
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+ return const E(); // Error.
+ ^";
+ }
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic {
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+ new E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+ const E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+ E.new; // Error.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+ new E.named(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+ const E().named(); // Error.
+ ^"{dynamic}.named();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+ E.named; // Error.
+ ^^^^^";
+ self::E::f();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ const E.f(); // Error.
+ ^";
+ #C11;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E {index:#C4, _name:#C5}
+ #C7 = constructor-tearoff self::E::f3
+ #C8 = constructor-tearoff self::E::f4
+ #C9 = constructor-tearoff self::E::f5
+ #C10 = constructor-tearoff self::E::f6
+ #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect
new file mode 100644
index 0000000..220fd42
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three, self::E::four];
+ static const field self::E one = const self::E::•(0, "one");
+ static const field self::E two = const self::E::named(1, "two");
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[self::E::f3, self::E::f4, self::E::f5, self::E::f6]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ ;
+ static factory f2() → self::E
+ ;
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f3)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f4)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f5)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f6)
+Extra constant evaluation: evaluated: 20, effectively constant: 8
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+// const factory E.f3() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+// factory E.f4() = E; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+// three.f(), // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+// four.f2(); // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+// - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+// factory E.f6(int value) = E.f; // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+// return const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+// new E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+// const E(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+// E.new; // Error.
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+// new E.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+// const E().named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+// E.named; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const E.f(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E one = #C3;
+ static const field self::E two = #C6;
+ static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^";
+ static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+ four.f2(); // Error.
+ ^^";
+ static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+ const constructor •(core::int index, core::String name) → self::E
+ : super core::_Enum::•(index, name)
+ ;
+ const constructor named(core::int index, core::String name) → self::E
+ : this self::E::•(index, name)
+ ;
+ method toString() → core::String
+ return "E.${this.{core::_Enum::_name}{core::String}}";
+ static factory f() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+ three.f(), // Error.
+ ^".{core::Iterable::first}{self::E};
+ static factory f2() → self::E {
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+ return const E(); // Error.
+ ^";
+ }
+ static factory f3() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+ const factory E.f3() = E; // Error.
+ ^";
+ static factory f4() → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+ factory E.f4() = E; // Error.
+ ^";
+ static factory f5() → self::E
+ return self::E::f();
+ static factory f6(core::int value) → self::E
+ return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+ factory E.f6(int value) = E.f; // Error.
+ ^";
+}
+static method test() → dynamic {
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+ new E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+ const E(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+ E.new; // Error.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+ new E.named(); // Error.
+ ^";
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+ const E().named(); // Error.
+ ^"{dynamic}.named();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+ E.named; // Error.
+ ^^^^^";
+ self::E::f();
+ invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ const E.f(); // Error.
+ ^";
+ #C11;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E {index:#C4, _name:#C5}
+ #C7 = constructor-tearoff self::E::f3
+ #C8 = constructor-tearoff self::E::f4
+ #C9 = constructor-tearoff self::E::f5
+ #C10 = constructor-tearoff self::E::f6
+ #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
index 7321935..6da4cc5 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = #C3;
static const field self::E<core::double, core::num> two = #C6;
static const field self::E<core::int, core::int> three = #C9;
- static const field self::E<dynamic, dynamic> four = #C12;
+ static const field self::E<core::num, core::bool> four = #C12;
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
index 7321935..6da4cc5 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = #C3;
static const field self::E<core::double, core::num> two = #C6;
static const field self::E<core::int, core::int> three = #C9;
- static const field self::E<dynamic, dynamic> four = #C12;
+ static const field self::E<core::num, core::bool> four = #C12;
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = #C3;
static const field self::E<core::double, core::num> two = #C6;
static const field self::E<core::int, core::int> three = #C9;
- static const field self::E<dynamic, dynamic> four = #C12;
+ static const field self::E<core::num, core::bool> four = #C12;
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = #C3;
static const field self::E<core::double, core::num> two = #C6;
static const field self::E<core::int, core::int> three = #C9;
- static const field self::E<dynamic, dynamic> four = #C12;
+ static const field self::E<core::num, core::bool> four = #C12;
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
index c39aa4b..d5da873 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = const self::E::•<core::int, core::String>(0, "one");
static const field self::E<core::double, core::num> two = const self::E::•<core::double, core::num>(1, "two");
static const field self::E<core::int, core::int> three = const self::E::named<core::int, core::int>(2, "three", 42);
- static const field self::E<dynamic, dynamic> four = const self::E::•<core::num, core::bool>(3, "four");
+ static const field self::E<core::num, core::bool> four = const self::E::•<core::num, core::bool>(3, "four");
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
static const field self::E<core::int, core::String> one = #C3;
static const field self::E<core::double, core::num> two = #C6;
static const field self::E<core::int, core::int> three = #C9;
- static const field self::E<dynamic, dynamic> four = #C12;
+ static const field self::E<core::num, core::bool> four = #C12;
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
index 0f6d2ba..d0efd75 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
index 0f6d2ba..d0efd75 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
index dbb7eac..d61af01 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+// f3.foo();
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
// f1,
// ^
@@ -10,10 +14,6 @@
// f2(42),
// ^
//
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-// f3.foo();
-// ^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart
new file mode 100644
index 0000000..7869a49
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E1 {
+ element;
+
+ E1(); // Error.
+ E1.named(); // Error.
+}
+
+enum E2 {
+ one.named1(),
+ two.named2();
+
+ const E2.named1() : super(); // Error.
+ const E2.named2() : super(42, "42"); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect
new file mode 100644
index 0000000..4aac745
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E1 { element; E1(); E1.named(); }
+enum E2 { one.named1(), two.named2(); const E2.named1() : super(); const E2.named2() : super(42, "42"); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect
new file mode 100644
index 0000000..c6d15b1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = const <self::E2>[self::E2::one, self::E2::two];
+ static const field self::E2 one = const self::E2::named1(0, "one");
+ static const field self::E2 two = const self::E2::named2(1, "two");
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml
new file mode 100644
index 0000000..eabefb8
--- /dev/null
+++ b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml
@@ -0,0 +1,10 @@
+# Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+entry_point: "main.dart"
+definitions: []
+position: "dart:io"
+static: true
+expression: |
+ Platform.isAndroid
diff --git a/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect
new file mode 100644
index 0000000..872d5f9
--- /dev/null
+++ b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+static method /*isLegacy, from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+ return dart.io::Platform::isAndroid;
diff --git a/pkg/front_end/testcases/general/issue48242.dart b/pkg/front_end/testcases/general/issue48242.dart
new file mode 100644
index 0000000..31998b5
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+mixin Base {
+ Object? methodWithDefaultImpl() {}
+}
+
+mixin TestFailure<A> on Base {
+ @override
+ methodWithDefaultImpl({A? nameParam});
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect
new file mode 100644
index 0000000..c106a99
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+mixin Base {
+ Object? methodWithDefaultImpl() {}
+}
+mixin TestFailure<A> on Base {
+ @override
+ methodWithDefaultImpl({A? nameParam});
+}
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c106a99
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+mixin Base {
+ Object? methodWithDefaultImpl() {}
+}
+mixin TestFailure<A> on Base {
+ @override
+ methodWithDefaultImpl({A? nameParam});
+}
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/ {
+ method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/ {
+ @#C1
+ abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants {
+ #C1 = core::_Override {}
+ #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/ {
+ method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/ {
+ @#C1
+ abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants {
+ #C1 = core::_Override {}
+ #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect
new file mode 100644
index 0000000..fe420e8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/ {
+ method methodWithDefaultImpl() → core::Object?
+ ;
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/ {
+ @core::override
+ abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam}) → core::Object?;
+}
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue48242.dart:10:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/ {
+ method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/ {
+ @#C1
+ abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants {
+ #C1 = core::_Override {}
+ #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart b/pkg/front_end/testcases/general/issue_47541.dart
new file mode 100644
index 0000000..23b18a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart
@@ -0,0 +1,59 @@
+void main() {
+ a();
+ b();
+ c(42);
+ d(42);
+}
+
+void a() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ on();
+}
+
+void b() {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+
+ onX(e) {
+ ;
+ }
+ onX("");
+}
+
+void c(int on) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ on = 42;
+}
+
+void d(int on) {
+ try {
+ ;
+ } catch (e) {
+ ;
+ } on Foo {
+ ;
+ }
+ on.toString();
+}
+
+void on() {}
+
+class Foo {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect
new file mode 100644
index 0000000..ef29dd0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+void main() {}
+void a() {}
+void b() {}
+void c(int on) {}
+void d(int on) {}
+void on() {}
+
+class Foo {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1dc83da
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class Foo {}
+
+void a() {}
+void b() {}
+void c(int on) {}
+void d(int on) {}
+void main() {}
+void on() {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+ synthetic constructor •() → self::Foo
+ : super core::Object::•()
+ ;
+}
+static method main() → void {
+ self::a();
+ self::b();
+ self::c(42);
+ self::d(42);
+}
+static method a() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ self::on();
+}
+static method b() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ function onX(dynamic e) → Null {
+ ;
+ }
+ onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on = 42;
+}
+static method d(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+ synthetic constructor •() → self::Foo
+ : super core::Object::•()
+ ;
+}
+static method main() → void {
+ self::a();
+ self::b();
+ self::c(42);
+ self::d(42);
+}
+static method a() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ self::on();
+}
+static method b() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ function onX(dynamic e) → Null {
+ ;
+ }
+ onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on = 42;
+}
+static method d(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect
new file mode 100644
index 0000000..8eaa23a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+ synthetic constructor •() → self::Foo
+ ;
+}
+static method main() → void
+ ;
+static method a() → void
+ ;
+static method b() → void
+ ;
+static method c(core::int on) → void
+ ;
+static method d(core::int on) → void
+ ;
+static method on() → void
+ ;
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+ synthetic constructor •() → self::Foo
+ : super core::Object::•()
+ ;
+}
+static method main() → void {
+ self::a();
+ self::b();
+ self::c(42);
+ self::d(42);
+}
+static method a() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ self::on();
+}
+static method b() → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ function onX(dynamic e) → Null {
+ ;
+ }
+ onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on = 42;
+}
+static method d(core::int on) → void {
+ try {
+ ;
+ }
+ on core::Object catch(final core::Object e) {
+ ;
+ }
+ on self::Foo catch(no-exception-var) {
+ ;
+ }
+ on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+// const B() : super();
+// ^
+//
// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
// const B() : super();
// ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+// const B() : super();
+// ^
+//
// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
// const B() : super();
// ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
index 8ebaafe..2bbebbe 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+// const B() : super();
+// ^
+//
// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
// const B() : super();
// ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
@@ -2,6 +2,10 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+// const B() : super();
+// ^
+//
// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
// const B() : super();
// ^
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index ca04916..5c09d8e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,12 +28,14 @@
constructor_tearoffs/new_as_selector: FormatterCrash
dart2js/late_fields: FormatterCrash
dart2js/late_statics: FormatterCrash
+enhanced_enums/constructor_calls: FormatterCrash
enhanced_enums/entries_with_type_arguments: FormatterCrash
enhanced_enums/enum_as_supertype: FormatterCrash
enhanced_enums/inference_in_constructor_parameters: FormatterCrash
enhanced_enums/instantiated_generic_enum_types: FormatterCrash
enhanced_enums/issue48084: FormatterCrash
enhanced_enums/issue48181: FormatterCrash
+enhanced_enums/malformed_constructors: FormatterCrash
enhanced_enums/members: FormatterCrash
enhanced_enums/named_arguments: FormatterCrash
enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index f75594a..3a8704e 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -12,9 +12,10 @@
dart2js/mixin_from_opt_in/main: SemiFuzzFailure
dart2js/mixin_from_opt_in/main.no_link: SemiFuzzFailure
general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure
-general/error_recovery/issue_39202.crash: SemiFuzzCrash
general/error_recovery/issue_39058.crash: SemiFuzzFailure
+general/error_recovery/issue_39202.crash: SemiFuzzCrash
general/platform_invalid_uris/main: SemiFuzzFailure
+general/supported_libraries/main: SemiFuzzFailure
nnbd_mixed/mixin_from_opt_in/main: SemiFuzzFailure
nnbd_mixed/mixin_from_opt_in/main.no_link: SemiFuzzFailure
regress/utf_16_le_content.crash: SemiFuzzCrash
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 8da2940..df0c74e 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -343,7 +343,7 @@
}
@override
- List<InterfaceType> getClassInterfaces(ClassElementImpl element) {
+ List<InterfaceType> getClassInterfaces(AbstractClassElementImpl element) {
return _wrapExceptions(
_fixBuilder!.unit,
() => element.interfacesInternal,
diff --git a/pkg/vm_snapshot_analysis/CHANGELOG.md b/pkg/vm_snapshot_analysis/CHANGELOG.md
index 9da6e6a1..f931fce 100644
--- a/pkg/vm_snapshot_analysis/CHANGELOG.md
+++ b/pkg/vm_snapshot_analysis/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## 0.7.1
+
+- Make `CallGraphNode.dominator` nullable.
+
## 0.7.0
- Migrate to null-safety.
diff --git a/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart b/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
index 06e8076..49fe928 100644
--- a/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
+++ b/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
@@ -39,7 +39,7 @@
/// Dominator of this node.
///
/// Computed by [CallGraph.computeDominators].
- late CallGraphNode dominator;
+ CallGraphNode? dominator;
/// Nodes dominated by this node.
///
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index cf8bed0..45627e6 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -1,6 +1,6 @@
name: vm_snapshot_analysis
description: Utilities for analysing AOT snapshot size.
-version: 0.7.0
+version: 0.7.1
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_snapshot_analysis
diff --git a/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart b/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
index f00e977..4301155 100644
--- a/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
+++ b/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
@@ -103,6 +103,7 @@
test('collapse-by-package', () async {
await withFlag(testSource, '--trace_precompiler_to', (json) async {
final jsonRaw = await loadJson(File(json));
+
final callGraph = loadTrace(jsonRaw).collapse(NodeType.packageNode);
// Collapsing by package should not collapse dart:* libraries into root
@@ -110,5 +111,15 @@
expect(callGraph.root.pred, isEmpty);
});
});
+
+ test('root-dominator-is-null', () async {
+ await withFlag(testSource, '--trace_precompiler_to', (json) async {
+ final jsonRaw = await loadJson(File(json));
+
+ final callGraph = loadTrace(jsonRaw).collapse(NodeType.classNode);
+
+ expect(callGraph.root.dominator, isNull);
+ });
+ });
});
}
diff --git a/runtime/docs/infra/coredumps.md b/runtime/docs/infra/coredumps.md
index 3e1e2d5..a35d924 100644
--- a/runtime/docs/infra/coredumps.md
+++ b/runtime/docs/infra/coredumps.md
@@ -45,11 +45,25 @@
![shard isolate out](images/isolated-out-link.png)
-This link would bring you to isolate server file browser where you will be
-able to download archived artifacts.
+This link would bring you to isolate server file browser where you can see the artifacts you can download.
![Isolate Server Browser](images/isolated-out-browser.png)
+One caveat is that file browser might fail to download large files, so you might need to use `cas` tool if you need to download those.
+
+`cas` tool is installed using `cipd`:
+```
+cipd install "infra/tools/luci/cas/\${platform}" -root ~/cas_tool
+```
+
+Then you point `cas` at digest hash for the directory to be downloaded:
+
+```
+~/cas_tool/cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest <digest_hash> -dir downloaded
+```
+
+where `<digest_hash>` is 'Digest' value from the isolate server browser listing.
+
### Cloud Storage
Other bots upload collected artifacts into a `dart-temp-crash-archive` Cloud Storage bucket. In this case you will see
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 41c46cf..aeb4640 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -631,9 +631,7 @@
// The shadow call stack register will be restored by the JumpToFrame stub.
#endif
- // TODO(b/209838275): Re-enable this once g3 build rules for gen_snapshot are
- // working with TSAN.
-#if 0 // defined(USING_THREAD_SANITIZER)
+#if defined(USING_THREAD_SANITIZER)
if (thread->exit_through_ffi() == Thread::kExitThroughRuntimeCall) {
auto tsan_utils = thread->tsan_utils();
tsan_utils->exception_pc = program_counter;
diff --git a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
index bd8533a..4053525 100644
--- a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
+++ b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
@@ -218,7 +218,7 @@
// always unboxed (Smi) values. Modification detection will be missed if you
// make exactly some multiple of 2^30 modifications between advances of an
// iterator.
- _modifications = (_modifications + 1) & 0x3ffffff;
+ _modifications = (_modifications + 1) & 0x3fffffff;
}
// Create a new cell and link it in as the last one in the list.
@@ -264,14 +264,14 @@
// Only treat unsigned 30-bit integers as numeric keys. This way,
// we avoid converting them to strings when we use them as keys in
// the JavaScript hash table object.
- return key is num && JS('bool', '(# & 0x3ffffff) === #', key, key);
+ return key is num && JS('bool', '(# & 0x3fffffff) === #', key, key);
}
int internalComputeHashCode(var key) {
// We force the hash codes to be unsigned 30-bit integers to avoid
// issues with problematic keys like '__proto__'. Another option
// would be to throw an exception if the hash code isn't a number.
- return JS('int', '# & 0x3ffffff', key.hashCode);
+ return JS('int', '# & 0x3fffffff', key.hashCode);
}
List<LinkedHashMapCell>? _getBucket(var table, var key) {
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index fcd668c..5dca72d 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -68,7 +68,8 @@
bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
-T getProperty<T>(Object o, Object name) => JS('Object|Null', '#[#]', o, name);
+T getProperty<T>(Object o, Object name) =>
+ JS<dynamic>('Object|Null', '#[#]', o, name);
// A CFE transformation may optimize calls to `setProperty`, when [value] is
// statically known to be a non-function.
@@ -88,40 +89,41 @@
// statically known to be non-functions.
T callMethod<T>(Object o, String method, List<Object?> args) {
assertInteropArgs(args);
- return JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
+ return JS<dynamic>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
}
/// Unchecked version for 0 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callMethodUnchecked0<T>(Object o, String method) {
- return JS('Object|Null', '#[#]()', o, method);
+ return JS<dynamic>('Object|Null', '#[#]()', o, method);
}
/// Unchecked version for 1 argument, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callMethodUnchecked1<T>(Object o, String method, Object? arg1) {
- return JS('Object|Null', '#[#](#)', o, method, arg1);
+ return JS<dynamic>('Object|Null', '#[#](#)', o, method, arg1);
}
/// Unchecked version for 2 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callMethodUnchecked2<T>(
Object o, String method, Object? arg1, Object? arg2) {
- return JS('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
+ return JS<dynamic>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
}
/// Unchecked version for 3 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callMethodUnchecked3<T>(
Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
- return JS('Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
+ return JS<dynamic>(
+ 'Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
}
/// Unchecked version for 4 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callMethodUnchecked4<T>(Object o, String method, Object? arg1, Object? arg2,
Object? arg3, Object? arg4) {
- return JS(
+ return JS<dynamic>(
'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
}
@@ -134,7 +136,7 @@
T callConstructor<T>(Object constr, List<Object?>? arguments) {
if (arguments == null) {
- return JS('Object', 'new #()', constr);
+ return JS<dynamic>('Object', 'new #()', constr);
} else {
assertInteropArgs(arguments);
}
@@ -143,29 +145,30 @@
int argumentCount = JS('int', '#.length', arguments);
switch (argumentCount) {
case 0:
- return JS('Object', 'new #()', constr);
+ return JS<dynamic>('Object', 'new #()', constr);
case 1:
var arg0 = JS('', '#[0]', arguments);
- return JS('Object', 'new #(#)', constr, arg0);
+ return JS<dynamic>('Object', 'new #(#)', constr, arg0);
case 2:
var arg0 = JS('', '#[0]', arguments);
var arg1 = JS('', '#[1]', arguments);
- return JS('Object', 'new #(#, #)', constr, arg0, arg1);
+ return JS<dynamic>('Object', 'new #(#, #)', constr, arg0, arg1);
case 3:
var arg0 = JS('', '#[0]', arguments);
var arg1 = JS('', '#[1]', arguments);
var arg2 = JS('', '#[2]', arguments);
- return JS('Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
+ return JS<dynamic>(
+ 'Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
case 4:
var arg0 = JS('', '#[0]', arguments);
var arg1 = JS('', '#[1]', arguments);
var arg2 = JS('', '#[2]', arguments);
var arg3 = JS('', '#[3]', arguments);
- return JS(
+ return JS<dynamic>(
'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
}
}
@@ -183,7 +186,7 @@
JS('String', 'String(#)', factoryFunction);
// This could return an UnknownJavaScriptObject, or a native
// object for which there is an interceptor
- return JS('Object', 'new #()', factoryFunction);
+ return JS<dynamic>('Object', 'new #()', factoryFunction);
// TODO(sra): Investigate:
//
@@ -196,33 +199,34 @@
/// Unchecked version for 0 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callConstructorUnchecked0<T>(Object constr) {
- return JS('Object', 'new #()', constr);
+ return JS<dynamic>('Object', 'new #()', constr);
}
/// Unchecked version for 1 argument, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callConstructorUnchecked1<T>(Object constr, Object? arg1) {
- return JS('Object', 'new #(#)', constr, arg1);
+ return JS<dynamic>('Object', 'new #(#)', constr, arg1);
}
/// Unchecked version for 2 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callConstructorUnchecked2<T>(Object constr, Object? arg1, Object? arg2) {
- return JS('Object', 'new #(#, #)', constr, arg1, arg2);
+ return JS<dynamic>('Object', 'new #(#, #)', constr, arg1, arg2);
}
/// Unchecked version for 3 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callConstructorUnchecked3<T>(
Object constr, Object? arg1, Object? arg2, Object? arg3) {
- return JS('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
+ return JS<dynamic>('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
}
/// Unchecked version for 4 arguments, only used in a CFE transformation.
@pragma('dart2js:tryInline')
T _callConstructorUnchecked4<T>(
Object constr, Object? arg1, Object? arg2, Object? arg3, Object? arg4) {
- return JS('Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
+ return JS<dynamic>(
+ 'Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
}
/// Exception for when the promise is rejected with a `null` or `undefined`
diff --git a/tests/language/constructor/redirect2_test.dart b/tests/language/constructor/redirect2_test.dart
index 85fc234..a1d50be 100644
--- a/tests/language/constructor/redirect2_test.dart
+++ b/tests/language/constructor/redirect2_test.dart
@@ -31,11 +31,9 @@
A.illegalSuper() : this(3), super(3);
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SUPER_IN_REDIRECTING_CONSTRUCTOR
- // [cfe] A redirecting constructor can't have other initializers.
+ // [cfe] A redirecting constructor can't have a 'super' initializer.
// ^
// [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
- // ^^^
- // [cfe] Too many positional arguments: 0 allowed, but 1 found.
}
main() {
diff --git a/tests/language_2/constructor/redirect2_test.dart b/tests/language_2/constructor/redirect2_test.dart
index 71aa1c3..39e5632 100644
--- a/tests/language_2/constructor/redirect2_test.dart
+++ b/tests/language_2/constructor/redirect2_test.dart
@@ -33,11 +33,9 @@
A.illegalSuper() : this(3), super(3);
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.SUPER_IN_REDIRECTING_CONSTRUCTOR
- // [cfe] A redirecting constructor can't have other initializers.
+ // [cfe] A redirecting constructor can't have a 'super' initializer.
// ^
// [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
- // ^^^
- // [cfe] Too many positional arguments: 0 allowed, but 1 found.
}
main() {
diff --git a/tests/lib/js/js_util/implicit_downcast_test.dart b/tests/lib/js/js_util/implicit_downcast_test.dart
new file mode 100644
index 0000000..b0d201b
--- /dev/null
+++ b/tests/lib/js/js_util/implicit_downcast_test.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests implicit downcasts in js_util.
+
+@JS()
+library js_util_implicit_downcast_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+ external Foo(num a);
+
+ external num get a;
+ external void set a(_);
+ external num bar();
+}
+
+bool isComplianceMode() {
+ var stuff = [1, 'string'];
+ var a = stuff[0];
+ // Detect whether we are using --omit-implicit-checks.
+ try {
+ String s = a as dynamic;
+ return false;
+ } catch (e) {
+ // Ignore.
+ }
+ return true;
+}
+
+main() {
+ eval(r"""
+ function Foo(a) {
+ this.a = a;
+ }
+
+ Foo.prototype.bar = function() {
+ return this.a;
+ }
+ """);
+
+ if (isComplianceMode()) {
+ complianceModeTest();
+ } else {
+ omitImplicitChecksTest();
+ }
+}
+
+complianceModeTest() {
+ var f = Foo(42);
+ expect(js_util.getProperty<int>(f, 'a'), equals(42));
+ expect(() => js_util.getProperty<List>(f, 'a'), throws);
+
+ f.a = 5;
+ expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+ expect(() => js_util.callMethod<List>(f, 'bar', []), throws);
+
+ // Check optimized lowering of callMethod.
+ expect(() => js_util.callMethod<List>(f, 'bar', [1]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), throws);
+
+ var f2 = Foo(7);
+ var fConstructor = js_util.getProperty(f, 'constructor');
+ expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+ expect(() => js_util.callConstructor<List>(fConstructor, [7]), throws);
+
+ // Check optimized lowering of callConstructor.
+ expect(() => js_util.callConstructor<List>(fConstructor, null), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, []), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2]), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3]), throws);
+ expect(
+ () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]),
+ throws);
+}
+
+omitImplicitChecksTest() {
+ var f = Foo(42);
+ expect(js_util.getProperty<int>(f, 'a'), equals(42));
+ expect(js_util.getProperty<List>(f, 'a'), equals(42));
+
+ f.a = 5;
+ expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', []), equals(5));
+
+ // Check optimized lowering of callMethod.
+ expect(js_util.callMethod<List>(f, 'bar', [1]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), equals(5));
+
+ var fConstructor = js_util.getProperty(f, 'constructor');
+ expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, [7]) as Foo).a, equals(7));
+
+ // Check optimized lowering of callConstructor.
+ expect((js_util.callConstructor<List>(fConstructor, null) as Foo).a,
+ equals(null));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, []) as Foo).a, equals(null));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2]) as Foo).a,
+ equals(1));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3]) as Foo).a,
+ equals(1));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]) as Foo).a,
+ equals(1));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]) as Foo).a,
+ equals(1));
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 46bdedf..ae16628 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -45,6 +45,7 @@
js/instanceof_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/is_check_and_as_cast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/async_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
+js/js_util/implicit_downcast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/jsify_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/promise_reject_null_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
diff --git a/tests/lib_2/js/js_util/implicit_downcast_test.dart b/tests/lib_2/js/js_util/implicit_downcast_test.dart
new file mode 100644
index 0000000..b0d201b
--- /dev/null
+++ b/tests/lib_2/js/js_util/implicit_downcast_test.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests implicit downcasts in js_util.
+
+@JS()
+library js_util_implicit_downcast_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+ external Foo(num a);
+
+ external num get a;
+ external void set a(_);
+ external num bar();
+}
+
+bool isComplianceMode() {
+ var stuff = [1, 'string'];
+ var a = stuff[0];
+ // Detect whether we are using --omit-implicit-checks.
+ try {
+ String s = a as dynamic;
+ return false;
+ } catch (e) {
+ // Ignore.
+ }
+ return true;
+}
+
+main() {
+ eval(r"""
+ function Foo(a) {
+ this.a = a;
+ }
+
+ Foo.prototype.bar = function() {
+ return this.a;
+ }
+ """);
+
+ if (isComplianceMode()) {
+ complianceModeTest();
+ } else {
+ omitImplicitChecksTest();
+ }
+}
+
+complianceModeTest() {
+ var f = Foo(42);
+ expect(js_util.getProperty<int>(f, 'a'), equals(42));
+ expect(() => js_util.getProperty<List>(f, 'a'), throws);
+
+ f.a = 5;
+ expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+ expect(() => js_util.callMethod<List>(f, 'bar', []), throws);
+
+ // Check optimized lowering of callMethod.
+ expect(() => js_util.callMethod<List>(f, 'bar', [1]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), throws);
+ expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), throws);
+
+ var f2 = Foo(7);
+ var fConstructor = js_util.getProperty(f, 'constructor');
+ expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+ expect(() => js_util.callConstructor<List>(fConstructor, [7]), throws);
+
+ // Check optimized lowering of callConstructor.
+ expect(() => js_util.callConstructor<List>(fConstructor, null), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, []), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2]), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3]), throws);
+ expect(
+ () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]), throws);
+ expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]),
+ throws);
+}
+
+omitImplicitChecksTest() {
+ var f = Foo(42);
+ expect(js_util.getProperty<int>(f, 'a'), equals(42));
+ expect(js_util.getProperty<List>(f, 'a'), equals(42));
+
+ f.a = 5;
+ expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', []), equals(5));
+
+ // Check optimized lowering of callMethod.
+ expect(js_util.callMethod<List>(f, 'bar', [1]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), equals(5));
+ expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), equals(5));
+
+ var fConstructor = js_util.getProperty(f, 'constructor');
+ expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, [7]) as Foo).a, equals(7));
+
+ // Check optimized lowering of callConstructor.
+ expect((js_util.callConstructor<List>(fConstructor, null) as Foo).a,
+ equals(null));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, []) as Foo).a, equals(null));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2]) as Foo).a,
+ equals(1));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3]) as Foo).a,
+ equals(1));
+ expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]) as Foo).a,
+ equals(1));
+ expect(
+ (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]) as Foo).a,
+ equals(1));
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index bef1d69..fbaf7af 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -45,6 +45,7 @@
js/instanceof_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/is_check_and_as_cast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/async_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
+js/js_util/implicit_downcast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/jsify_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
js/js_util/promise_reject_null_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
diff --git a/tools/VERSION b/tools/VERSION
index d2fe2b3..bdc251a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 71
+PRERELEASE 72
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/linux_dist_support/linux_distribution_support.py b/tools/linux_dist_support/linux_distribution_support.py
index b7c5529..cb739d4 100644
--- a/tools/linux_dist_support/linux_distribution_support.py
+++ b/tools/linux_dist_support/linux_distribution_support.py
@@ -52,9 +52,7 @@
def TestInstallation(assume_installed=True):
- paths = ['/usr/bin/dart']
- for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
- paths.append(os.path.join('/usr/lib/dart/bin', tool))
+ paths = ['/usr/bin/dart', '/usr/lib/dart/bin/dart']
for path in paths:
if os.path.exists(path):
if not assume_installed:
@@ -100,7 +98,7 @@
])
if os.path.exists('/usr/bin/dart') or os.path.exists(
- '/usr/lib/dart/bin/dart2js'):
+ '/usr/lib/dart/bin/dart'):
print("Dart already installed, removing")
UninstallDart()
TestInstallation(assume_installed=False)
@@ -118,11 +116,11 @@
# run as root)
Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
- # Sanity check dart2js and the analyzer against a hello world program
+ # Check dart, dart compile js, and dart analyze against a hello world program
with utils.TempDir() as temp_dir:
test_file = CreateDartTestFile(temp_dir)
- Run(['/usr/lib/dart/bin/dart2js', test_file])
- Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
+ Run(['/usr/lib/dart/bin/dart', 'compile', 'js', test_file])
+ Run(['/usr/lib/dart/bin/dart', 'analyze', test_file])
Run(['/usr/lib/dart/bin/dart', test_file])
UninstallDart()