Version 2.16.0-144.0.dev
Merge commit '2ad5ab51bdede28586d21d49258898150c779f1b' into 'dev'
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 25895fe..77326fb 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -256,6 +256,7 @@
CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
CompileTimeErrorCode.INVALID_OVERRIDE,
CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION,
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index f30fcca..7788785 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -76,6 +76,24 @@
return null;
}
+extension ConstructorDeclarationExtension on ConstructorDeclaration {
+ bool get isNonRedirectingGenerative {
+ // Must be generative.
+ if (externalKeyword != null || factoryKeyword != null) {
+ return false;
+ }
+
+ // Must be non-redirecting.
+ for (var initializer in initializers) {
+ if (initializer is RedirectingConstructorInvocation) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
extension ExpressionExtension on Expression {
/// Return the static type of this expression.
///
@@ -104,6 +122,14 @@
return self;
}
+ FormalParameterList get parentFormalParameterList {
+ var parent = this.parent;
+ if (parent is DefaultFormalParameter) {
+ parent = parent.parent;
+ }
+ return parent as FormalParameterList;
+ }
+
AstNode get typeOrSelf {
var self = this;
if (self is SimpleFormalParameter) {
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 42f8ae1..0f00d43 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -7520,6 +7520,20 @@
/**
* Parameters:
+ * 0: the super modifier
+ */
+ static const CompileTimeErrorCode INVALID_SUPER_FORMAL_PARAMETER_LOCATION =
+ CompileTimeErrorCode(
+ 'INVALID_SUPER_FORMAL_PARAMETER_LOCATION',
+ "Super-formal parameters can only be used in non-redirecting generative "
+ "constructors.",
+ correctionMessage:
+ "Try removing the 'super' modifier, or changing the constructor to be "
+ "non-redirecting and generative.",
+ );
+
+ /**
+ * Parameters:
* 0: the name of the type parameter
*/
// #### Description
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 1d7d77c..7d363ca 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1140,6 +1140,20 @@
}
@override
+ void visitSuperFormalParameter(SuperFormalParameter node) {
+ var constructor = node.parentFormalParameterList.parent;
+ if (!(constructor is ConstructorDeclaration &&
+ constructor.isNonRedirectingGenerative)) {
+ errorReporter.reportErrorForToken(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION,
+ node.superKeyword,
+ );
+ }
+
+ super.visitSuperFormalParameter(node);
+ }
+
+ @override
void visitSwitchCase(SwitchCase node) {
_withHiddenElements(node.statements, () {
_duplicateDefinitionVerifier.checkStatements(node.statements);
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index b079038..fc0b1e9 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -6526,6 +6526,12 @@
class C {}
```
+ INVALID_SUPER_FORMAL_PARAMETER_LOCATION:
+ problemMessage: "Super-formal parameters can only be used in non-redirecting generative constructors."
+ comment: |-
+ Parameters:
+ 0: the super modifier
+ correctionMessage: Try removing the 'super' modifier, or changing the constructor to be non-redirecting and generative.
INVALID_TYPE_ARGUMENT_IN_CONST_LIST:
sharedName: INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
problemMessage: "Constant list literals can't include a type parameter as a type argument, such as '{0}'."
diff --git a/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
index 6a24380..83f2777 100644
--- a/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_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/error/codes.dart';
import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -46,9 +47,11 @@
}
test_invalid_notConstructor() async {
- await assertNoErrorsInCode(r'''
+ await assertErrorsInCode(r'''
void f(super.a) {}
-''');
+''', [
+ error(CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 7, 5),
+ ]);
var f = findElement.topFunction('f');
var element = f.superFormalParameter('a');
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart
new file mode 100644
index 0000000..adaa449
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart
@@ -0,0 +1,155 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(InvalidSuperFormalParameterLocationTest);
+ });
+}
+
+@reflectiveTest
+class InvalidSuperFormalParameterLocationTest extends PubPackageResolutionTest {
+ test_class_constructor_external() async {
+ await assertErrorsInCode(r'''
+class A {
+ external A(super.a);
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 23, 5),
+ ]);
+ }
+
+ test_class_constructor_factory() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A(super.a) {
+ return A._();
+ }
+ A._();
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 22, 5),
+ ]);
+ }
+
+ test_class_constructor_redirecting() async {
+ await assertErrorsInCode(r'''
+class A {
+ A(super.a) : this._();
+ A._();
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 14, 5),
+ ]);
+ }
+
+ test_class_method() async {
+ await assertErrorsInCode(r'''
+class A {
+ void foo(super.a) {}
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 21, 5),
+ ]);
+ }
+
+ test_extension_method() async {
+ await assertErrorsInCode(r'''
+extension E on int {
+ void foo(super.a) {}
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 32, 5),
+ ]);
+ }
+
+ test_local_function() async {
+ await assertErrorsInCode(r'''
+void f() {
+ // ignore:unused_element
+ void g(super.a) {}
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 47, 5),
+ ]);
+ }
+
+ test_mixin_method() async {
+ await assertErrorsInCode(r'''
+mixin M {
+ void foo(super.a) {}
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 21, 5),
+ ]);
+ }
+
+ test_unit_function() async {
+ await assertErrorsInCode(r'''
+void f(super.a) {}
+''', [
+ error(CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 7, 5),
+ ]);
+ }
+
+ test_valid_optionalNamed() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ A({int? a});
+}
+
+class B extends A {
+ B({super.a});
+}
+''');
+ }
+
+ test_valid_optionalPositional() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ A([int? a]);
+}
+
+class B extends A {
+ B([super.a]);
+}
+''');
+ }
+
+ test_valid_requiredNamed() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ A({required int a});
+}
+
+class B extends A {
+ B({required super.a});
+}
+''');
+ }
+
+ test_valid_requiredPositional() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ A(int a);
+}
+
+class B extends A {
+ B(super.a);
+}
+''');
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 485fb55..639450e 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -346,6 +346,8 @@
import 'invalid_required_positional_param_test.dart'
as invalid_required_positional_param;
import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
+import 'invalid_super_formal_parameter_location_test.dart'
+ as invalid_super_formal_parameter_location;
import 'invalid_super_in_initializer_test.dart' as invalid_super_in_initializer;
import 'invalid_type_argument_in_const_list_test.dart'
as invalid_type_argument_in_const_list;
@@ -952,6 +954,7 @@
invalid_required_optional_positional_param.main();
invalid_required_positional_param.main();
invalid_sealed_annotation.main();
+ invalid_super_formal_parameter_location.main();
invalid_super_in_initializer.main();
invalid_type_argument_in_const_list.main();
invalid_type_argument_in_const_map.main();
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 847a435..509bb49 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -833,8 +833,9 @@
typeAliasedFactoryInvocations.remove(initializer);
}
} else {
- initializer = typeInferrer.inferFieldInitializer(
- this, fieldBuilder.builtType, initializer);
+ initializer = typeInferrer
+ .inferFieldInitializer(this, fieldBuilder.builtType, initializer)
+ .expression;
if (transformCollections || transformSetLiterals) {
// Wrap the initializer in a temporary parent expression; the
@@ -1644,6 +1645,15 @@
return annotation;
}
+ Arguments parseArguments(Token token) {
+ Parser parser = new Parser(this,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+ token = parser.parseArgumentsRest(token);
+ Arguments arguments = pop() as Arguments;
+ checkEmpty(token.charOffset);
+ return arguments;
+ }
+
void finishConstructor(SourceConstructorBuilder builder,
AsyncMarker asyncModifier, Statement? body) {
/// Quotes below are from [Dart Programming Language Specification, 4th
@@ -1757,10 +1767,25 @@
Constructor? superTarget = lookupConstructor(emptyName, isSuper: true);
Initializer initializer;
Arguments arguments;
+ List<Expression>? positionalArguments;
+ List<NamedExpression>? namedArguments;
if (libraryBuilder.enableSuperParametersInLibrary) {
+ positionalArguments = positionalSuperParametersAsArguments;
+ namedArguments = namedSuperParametersAsArguments;
+ }
+ if (classBuilder is EnumBuilder) {
+ assert(constructor.function.positionalParameters.length >= 2 &&
+ constructor.function.positionalParameters[0].name == "index" &&
+ constructor.function.positionalParameters[1].name == "name");
+ (positionalArguments ??= <Expression>[]).insertAll(0, [
+ new VariableGet(constructor.function.positionalParameters[0]),
+ new VariableGet(constructor.function.positionalParameters[1])
+ ]);
+ }
+ if (positionalArguments != null || namedArguments != null) {
arguments = forest.createArguments(
- noLocation, positionalSuperParametersAsArguments ?? <Expression>[],
- named: namedSuperParametersAsArguments);
+ noLocation, positionalArguments ?? <Expression>[],
+ named: namedArguments);
} else {
arguments = forest.createArgumentsEmpty(noLocation);
}
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 7f34cfd..75da84f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2004,7 +2004,7 @@
@override
void endArguments(int count, Token beginToken, Token endToken) {
debugEvent("Arguments");
- push(NullValue.Arguments);
+ push(beginToken);
}
@override
@@ -2307,14 +2307,42 @@
@override
void handleEnumElement(Token beginToken) {
debugEvent("EnumElements");
- pop(); // arguments.
- pop(); // constructor reference.
- // Keep on the stack the EnumConstantInfo created in handleIdentifier.
+ Token? argumentsBeginToken = pop() as Token?;
+
+ ConstructorReferenceBuilder? constructorReferenceBuilder =
+ pop() as ConstructorReferenceBuilder?;
+ Object? enumConstantInfo = pop();
+ if (enumConstantInfo is EnumConstantInfo) {
+ push(enumConstantInfo
+ ..constructorReferenceBuilder = constructorReferenceBuilder
+ ..argumentsBeginToken = argumentsBeginToken);
+ } else {
+ assert(enumConstantInfo is ParserRecovery);
+ push(enumConstantInfo);
+ }
}
@override
void handleEnumHeader(Token enumKeyword, Token leftBrace) {
debugEvent("EnumHeader");
+
+ // We pop more values than needed to reach typeVariables, offset and name.
+ List<TypeBuilder>? interfaces = pop() as List<TypeBuilder>?;
+ List<TypeBuilder>? mixins = pop() as List<TypeBuilder>?;
+ List<TypeVariableBuilder>? typeVariables =
+ pop() as List<TypeVariableBuilder>?;
+ int charOffset = popCharOffset(); // identifier char offset.
+ Object? name = pop();
+
+ libraryBuilder.currentTypeParameterScopeBuilder.markAsEnumDeclaration(
+ name is String ? name : "<syntax-error>", charOffset, typeVariables);
+
+ push(name ?? NullValue.Name);
+ push(charOffset);
+ push(typeVariables ?? NullValue.TypeVariables);
+ push(mixins ?? NullValue.TypeBuilderList);
+ push(interfaces ?? NullValue.TypeBuilderList);
+
push(enumKeyword.charOffset); // start char offset.
push(leftBrace.endGroup!.charOffset); // end char offset.
}
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 ed633a7..8fbed56 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
@@ -76,13 +76,16 @@
final List<SynthesizedFunctionNode> _superParameterDefaultValueCloners =
<SynthesizedFunctionNode>[];
+ @override
+ List<FormalParameterBuilder>? formals;
+
SourceConstructorBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
TypeBuilder? returnType,
String name,
List<TypeVariableBuilder>? typeVariables,
- List<FormalParameterBuilder>? formals,
+ this.formals,
SourceLibraryBuilder compilationUnit,
int startCharOffset,
int charOffset,
@@ -670,6 +673,14 @@
_initializedFields = null;
return result;
}
+
+ void ensureGrowableFormals() {
+ if (formals != null) {
+ formals = new List<FormalParameterBuilder>.from(formals!, growable: true);
+ } else {
+ formals = <FormalParameterBuilder>[];
+ }
+ }
}
class SyntheticConstructorBuilder extends DillConstructorBuilder
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 112e190..9e13bbc 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
@@ -4,6 +4,8 @@
library fasta.enum_builder;
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+
import 'package:kernel/ast.dart'
show
Arguments,
@@ -11,6 +13,7 @@
Class,
Constructor,
ConstructorInvocation,
+ DartType,
Expression,
Field,
InstanceAccessKind,
@@ -26,12 +29,14 @@
StringConcatenation,
StringLiteral,
SuperInitializer,
- ThisExpression;
+ ThisExpression,
+ setParents;
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/reference_from_index.dart' show IndexedClass;
import '../builder/builder.dart';
import '../builder/class_builder.dart';
+import '../builder/constructor_reference_builder.dart';
import '../builder/field_builder.dart';
import '../builder/formal_parameter_builder.dart';
import '../builder/library_builder.dart';
@@ -41,6 +46,7 @@
import '../builder/nullability_builder.dart';
import '../builder/procedure_builder.dart';
import '../builder/type_builder.dart';
+import '../builder/type_variable_builder.dart';
import '../fasta_codes.dart'
show
LocatedMessage,
@@ -49,10 +55,18 @@
templateDuplicatedDeclarationCause,
templateDuplicatedDeclarationSyntheticCause,
templateEnumConstantSameNameAsEnclosing;
+
+import '../kernel/body_builder.dart';
import '../kernel/constructor_tearoff_lowering.dart';
import '../kernel/kernel_helper.dart';
+import '../kernel/internal_ast.dart';
+
import '../modifier.dart' show constMask, hasInitializerMask, staticMask;
+
+import '../constant_context.dart';
import '../scope.dart';
+import '../type_inference/type_inferrer.dart';
+import '../type_inference/type_schema.dart';
import '../util/helpers.dart';
import 'name_scheme.dart';
import 'source_class_builder.dart' show SourceClassBuilder;
@@ -72,9 +86,12 @@
final NamedTypeBuilder listType;
+ SourceConstructorBuilder? _synthesizedDefaultConstructorBuilder;
+
EnumBuilder.internal(
List<MetadataBuilder>? metadata,
String name,
+ List<TypeVariableBuilder>? typeVariables,
Scope scope,
ConstructorScope constructors,
Class cls,
@@ -93,7 +110,7 @@
metadata,
0,
name,
- /* typeVariable = */ null,
+ typeVariables,
enumType,
/* interfaces = */ null,
/* onTypes = */ null,
@@ -110,6 +127,7 @@
factory EnumBuilder(
List<MetadataBuilder>? metadata,
String name,
+ List<TypeVariableBuilder>? typeVariables,
List<EnumConstantInfo?>? enumConstantInfos,
SourceLibraryBuilder parent,
int startCharOffset,
@@ -164,6 +182,8 @@
instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
Class cls = new Class(
name: name,
+ typeParameters:
+ TypeVariableBuilder.typeParametersFromBuilders(typeVariables),
reference: referencesFromIndexed?.cls.reference,
fileUri: fileUri);
Map<String, MemberBuilder> members = <String, MemberBuilder>{};
@@ -235,27 +255,6 @@
referencesFromIndexed.lookupSetterReference(valuesName);
}
- SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
- /* metadata = */ null,
- constMask,
- /* returnType = */ null,
- "",
- /* typeParameters = */ null,
- <FormalParameterBuilder>[
- new FormalParameterBuilder(
- null, 0, intType, "index", parent, charOffset),
- new FormalParameterBuilder(
- null, 0, stringType, "name", parent, charOffset)
- ],
- parent,
- charOffset,
- charOffset,
- charOffset,
- charEndOffset,
- constructorReference,
- tearOffReference,
- forAbstractClassOrEnum: true);
- constructors[""] = constructorBuilder;
FieldBuilder valuesBuilder = new SourceFieldBuilder(
/* metadata = */ null,
listType,
@@ -270,6 +269,48 @@
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
members["values"] = valuesBuilder;
+
+ SourceConstructorBuilder? synthesizedDefaultConstructorBuilder;
+ if (constructorScope.local.isEmpty) {
+ synthesizedDefaultConstructorBuilder = new SourceConstructorBuilder(
+ /* metadata = */ null,
+ constMask,
+ /* returnType = */ null,
+ "",
+ /* typeParameters = */ null,
+ <FormalParameterBuilder>[
+ new FormalParameterBuilder(
+ null, 0, intType, "index", parent, charOffset),
+ new FormalParameterBuilder(
+ null, 0, stringType, "name", parent, charOffset)
+ ],
+ parent,
+ charOffset,
+ charOffset,
+ charOffset,
+ charEndOffset,
+ constructorReference,
+ tearOffReference,
+ forAbstractClassOrEnum: true);
+ synthesizedDefaultConstructorBuilder
+ .registerInitializedField(valuesBuilder);
+ constructors[""] = synthesizedDefaultConstructorBuilder;
+ } else {
+ constructorScope.forEach((name, member) {
+ if (member is SourceConstructorBuilder) {
+ member.ensureGrowableFormals();
+ member.formals!.insert(
+ 0,
+ new FormalParameterBuilder(
+ null, 0, stringType, "name", parent, charOffset));
+ member.formals!.insert(
+ 0,
+ new FormalParameterBuilder(
+ null, 0, intType, "index", parent, charOffset));
+ }
+ });
+ }
+
ProcedureBuilder toStringBuilder = new SourceProcedureBuilder(
/* metadata = */ null,
0,
@@ -290,7 +331,6 @@
isExtensionMember: false,
isInstanceMember: true);
members["toString"] = toStringBuilder;
- constructorBuilder.registerInitializedField(valuesBuilder);
String className = name;
if (enumConstantInfos != null) {
for (int i = 0; i < enumConstantInfos.length; i++) {
@@ -364,6 +404,7 @@
EnumBuilder enumBuilder = new EnumBuilder.internal(
metadata,
name,
+ typeVariables,
new Scope(
local: members,
setters: setters,
@@ -382,7 +423,9 @@
startCharOffsetComputed,
charOffset,
charEndOffset,
- referencesFromIndexed);
+ referencesFromIndexed)
+ .._synthesizedDefaultConstructorBuilder =
+ synthesizedDefaultConstructorBuilder;
void setParent(String name, MemberBuilder? builder) {
while (builder != null) {
@@ -435,27 +478,39 @@
SourceFieldBuilder valuesBuilder =
firstMemberNamed("values") as SourceFieldBuilder;
valuesBuilder.build(libraryBuilder);
- SourceConstructorBuilder constructorBuilder =
- constructorScopeBuilder[""] as SourceConstructorBuilder;
- Constructor constructor = constructorBuilder.build(libraryBuilder);
- ClassBuilder objectClass = objectType.declaration as ClassBuilder;
- ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
- MemberBuilder? superConstructor = enumClass.findConstructorOrFactory(
- "", charOffset, fileUri, libraryBuilder);
- if (superConstructor == null || !superConstructor.isConstructor) {
- // TODO(ahe): Ideally, we would also want to check that [Object]'s
- // unnamed constructor requires no arguments. But that information isn't
- // always available at this point, and it's not really a situation that
- // can happen unless you start modifying the SDK sources.
- // (We should add a correct message. We no longer depend on Object here.)
- library.addProblem(messageNoUnnamedConstructorInObject,
- objectClass.charOffset, objectClass.name.length, objectClass.fileUri);
- } else {
- constructor.initializers.add(new SuperInitializer(
- superConstructor.member as Constructor,
- new Arguments.forwarded(constructor.function, libraryBuilder.library))
- ..parent = constructor);
+
+ // The super initializer for the synthesized default constructor is
+ // inserted here. Other constructors are handled in
+ // [BodyBuilder.finishConstructor], as they are processed via the pipeline
+ // for constructor parsing and building.
+ if (_synthesizedDefaultConstructorBuilder != null) {
+ Constructor constructor =
+ _synthesizedDefaultConstructorBuilder!.build(libraryBuilder);
+ ClassBuilder objectClass = objectType.declaration as ClassBuilder;
+ ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
+ MemberBuilder? superConstructor = enumClass.findConstructorOrFactory(
+ "", charOffset, fileUri, libraryBuilder);
+ if (superConstructor == null || !superConstructor.isConstructor) {
+ // TODO(ahe): Ideally, we would also want to check that [Object]'s
+ // unnamed constructor requires no arguments. But that information
+ // isn't always available at this point, and it's not really a
+ // situation that can happen unless you start modifying the SDK
+ // sources. (We should add a correct message. We no longer depend on
+ // Object here.)
+ library.addProblem(
+ messageNoUnnamedConstructorInObject,
+ objectClass.charOffset,
+ objectClass.name.length,
+ objectClass.fileUri);
+ } else {
+ constructor.initializers.add(new SuperInitializer(
+ superConstructor.member as Constructor,
+ new Arguments.forwarded(
+ constructor.function, libraryBuilder.library))
+ ..parent = constructor);
+ }
}
+
return super.build(libraryBuilder, coreLibrary);
}
@@ -484,9 +539,7 @@
classHierarchy.coreTypes,
new ListLiteral(values,
typeArgument: rawType(library.nonNullable), isConst: true));
- SourceConstructorBuilder constructorBuilder =
- constructorScopeBuilder[""] as SourceConstructorBuilder;
- Constructor constructor = constructorBuilder.constructor;
+
int index = 0;
if (enumConstantInfos != null) {
for (EnumConstantInfo? enumConstantInfo in enumConstantInfos!) {
@@ -499,12 +552,64 @@
} else {
continue;
}
- Arguments arguments = new Arguments(<Expression>[
- new IntLiteral(index++),
- new StringLiteral(constant),
- ]);
- field.buildBody(classHierarchy.coreTypes,
- new ConstructorInvocation(constructor, arguments, isConst: true));
+
+ String constructorName =
+ enumConstantInfo.constructorReferenceBuilder?.suffix ?? "";
+ SourceConstructorBuilder? constructorBuilder =
+ constructorScopeBuilder[constructorName]
+ as SourceConstructorBuilder?;
+
+ if (constructorBuilder == null) {
+ // TODO(cstefantsova): Report an error.
+ } else {
+ Arguments arguments;
+ List<Expression> enumSyntheticArguments = <Expression>[
+ new IntLiteral(index++),
+ new StringLiteral(constant),
+ ];
+ List<DartType>? typeArguments;
+ List<TypeBuilder>? typeArgumentBuilders =
+ enumConstantInfo.constructorReferenceBuilder?.typeArguments;
+ if (typeArgumentBuilders != null) {
+ typeArguments = <DartType>[];
+ for (TypeBuilder typeBuilder in typeArgumentBuilders) {
+ typeArguments.add(typeBuilder.build(library));
+ }
+ }
+ BodyBuilder? bodyBuilder;
+ if (enumConstantInfo.argumentsBeginToken != null) {
+ bodyBuilder = library.loader
+ .createBodyBuilderForOutlineExpression(
+ library, this, this, scope, fileUri);
+ bodyBuilder.constantContext = ConstantContext.required;
+ arguments = bodyBuilder
+ .parseArguments(enumConstantInfo.argumentsBeginToken!);
+ bodyBuilder.performBacklogComputations(delayedActionPerformers);
+
+ arguments.positional.insertAll(0, enumSyntheticArguments);
+ } else {
+ arguments = new ArgumentsImpl(enumSyntheticArguments);
+ }
+ if (typeArguments != null && arguments is ArgumentsImpl) {
+ ArgumentsImpl.setNonInferrableArgumentTypes(
+ arguments, typeArguments);
+ }
+ setParents(enumSyntheticArguments, arguments);
+ Expression initializer = new ConstructorInvocation(
+ constructorBuilder.constructor, arguments,
+ isConst: true)
+ ..fileOffset = field.charOffset;
+ if (bodyBuilder != null) {
+ ExpressionInferenceResult inferenceResult =
+ bodyBuilder.typeInferrer.inferFieldInitializer(
+ bodyBuilder, const UnknownType(), initializer);
+ initializer = inferenceResult.expression;
+ if (field is SourceFieldBuilder) {
+ field.fieldType = inferenceResult.inferredType;
+ }
+ }
+ field.buildBody(classHierarchy.coreTypes, initializer);
+ }
}
}
}
@@ -543,5 +648,8 @@
final List<MetadataBuilder>? metadata;
final String name;
final int charOffset;
- const EnumConstantInfo(this.metadata, this.name, this.charOffset);
+ ConstructorReferenceBuilder? constructorReferenceBuilder;
+ Token? argumentsBeginToken;
+
+ EnumConstantInfo(this.metadata, this.name, this.charOffset);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
index 634ffab..d864cd8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
@@ -405,10 +405,10 @@
library, declarationBuilder, this, scope, fileUri);
bodyBuilder.constantContext =
isConst ? ConstantContext.inferred : ConstantContext.required;
- Expression initializer = bodyBuilder.typeInferrer.inferFieldInitializer(
- bodyBuilder,
- fieldType,
- bodyBuilder.parseFieldInitializer(_constInitializerToken!));
+ Expression initializer = bodyBuilder.typeInferrer
+ .inferFieldInitializer(bodyBuilder, fieldType,
+ bodyBuilder.parseFieldInitializer(_constInitializerToken!))
+ .expression;
if (bodyBuilder.transformSetLiterals ||
bodyBuilder.transformCollections) {
// Wrap the initializer in a temporary parent expression; the
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 4b3cd4c..b60f0ec 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
@@ -2809,10 +2809,9 @@
referencesFromIndexed!.lookupIndexedClass(name);
}
// Nested declaration began in `OutlineBuilder.beginEnum`.
- // TODO(cstefantsova): Use actual type variables here.
TypeParameterScopeBuilder declaration =
endNestedDeclaration(TypeParameterScopeKind.enumDeclaration, name)
- ..resolveNamedTypes([], this);
+ ..resolveNamedTypes(typeVariables, this);
Map<String, Builder> members = declaration.members!;
Map<String, MemberBuilder> constructors = declaration.constructors!;
Map<String, MemberBuilder> setters = declaration.setters!;
@@ -2820,6 +2819,7 @@
EnumBuilder enumBuilder = new EnumBuilder(
metadata,
name,
+ typeVariables,
enumConstantInfos,
this,
startCharOffset,
@@ -5027,6 +5027,17 @@
_typeVariables = typeVariables;
}
+ /// Registers that this builder is preparing for an enum declaration with
+ /// the given [name] and [typeVariables] located [charOffset].
+ void markAsEnumDeclaration(
+ String name, int charOffset, List<TypeVariableBuilder>? typeVariables) {
+ assert(_kind == TypeParameterScopeKind.enumDeclaration,
+ "Unexpected declaration kind: $_kind");
+ _name = name;
+ _charOffset = charOffset;
+ _typeVariables = typeVariables;
+ }
+
/// Registers the 'extension this type' of the extension declaration prepared
/// for by this builder.
///
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 78618cb..f30fc34 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -116,7 +116,7 @@
AssignedVariables<TreeNode, VariableDeclaration> get assignedVariables;
/// Performs full type inference on the given field initializer.
- Expression inferFieldInitializer(
+ ExpressionInferenceResult inferFieldInitializer(
InferenceHelper helper, DartType declaredType, Expression initializer);
/// Returns the type used as the inferred type of a variable declaration,
@@ -2030,7 +2030,7 @@
}
@override
- Expression inferFieldInitializer(
+ ExpressionInferenceResult inferFieldInitializer(
InferenceHelper helper,
DartType context,
Expression initializer,
@@ -2043,7 +2043,8 @@
initializer = ensureAssignableResult(context, initializerResult,
isVoidAllowed: context is VoidType);
this.helper = null;
- return initializer;
+ return new ExpressionInferenceResult(
+ initializerResult.inferredType, initializer);
}
@override
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 6ad6b41..899e7e9f 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
import self as self;
import "dart:core" as core;
-class E extends core::_Enum /*isEnum*/ {
- static const field core::List<self::E> values = #C10;
- static const field self::E one = #C3;
- static const field self::E two = #C6;
- static const field self::E three = #C9;
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+ 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;
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
constants {
#C1 = 0
#C2 = "one"
- #C3 = self::E {index:#C1, _name:#C2}
+ #C3 = self::E<core::int, core::String> {index:#C1, _name:#C2}
#C4 = 1
#C5 = "two"
- #C6 = self::E {index:#C4, _name:#C5}
+ #C6 = self::E<core::double, core::num> {index:#C4, _name:#C5}
#C7 = 2
#C8 = "three"
- #C9 = self::E {index:#C7, _name:#C8}
- #C10 = <self::E>[#C3, #C6, #C9]
+ #C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
+ #C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
}
Constructor coverage from constants:
org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10: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:///entries_with_type_arguments.dart:11:9)
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 6ad6b41..899e7e9f 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
import self as self;
import "dart:core" as core;
-class E extends core::_Enum /*isEnum*/ {
- static const field core::List<self::E> values = #C10;
- static const field self::E one = #C3;
- static const field self::E two = #C6;
- static const field self::E three = #C9;
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+ 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;
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
constants {
#C1 = 0
#C2 = "one"
- #C3 = self::E {index:#C1, _name:#C2}
+ #C3 = self::E<core::int, core::String> {index:#C1, _name:#C2}
#C4 = 1
#C5 = "two"
- #C6 = self::E {index:#C4, _name:#C5}
+ #C6 = self::E<core::double, core::num> {index:#C4, _name:#C5}
#C7 = 2
#C8 = "three"
- #C9 = self::E {index:#C7, _name:#C8}
- #C10 = <self::E>[#C3, #C6, #C9]
+ #C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
+ #C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
}
Constructor coverage from constants:
org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10: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:///entries_with_type_arguments.dart:11:9)
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 5081c27..fbd0a6f 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
import self as self;
import "dart:core" as core;
-class E extends core::_Enum /*isEnum*/ {
- static const field core::List<self::E> values = #C10;
- static const field self::E one = #C3;
- static const field self::E two = #C6;
- static const field self::E three = #C9;
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+ 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;
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
constants {
#C1 = 0
#C2 = "one"
- #C3 = self::E {index:#C1, _name:#C2}
+ #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
#C4 = 1
#C5 = "two"
- #C6 = self::E {index:#C4, _name:#C5}
+ #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
#C7 = 2
#C8 = "three"
- #C9 = self::E {index:#C7, _name:#C8}
- #C10 = <self::E*>[#C3, #C6, #C9]
+ #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+ #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
}
Constructor coverage from constants:
org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10: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:///entries_with_type_arguments.dart:11:9)
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 5081c27..fbd0a6f 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
import self as self;
import "dart:core" as core;
-class E extends core::_Enum /*isEnum*/ {
- static const field core::List<self::E> values = #C10;
- static const field self::E one = #C3;
- static const field self::E two = #C6;
- static const field self::E three = #C9;
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+ 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;
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
constants {
#C1 = 0
#C2 = "one"
- #C3 = self::E {index:#C1, _name:#C2}
+ #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
#C4 = 1
#C5 = "two"
- #C6 = self::E {index:#C4, _name:#C5}
+ #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
#C7 = 2
#C8 = "three"
- #C9 = self::E {index:#C7, _name:#C8}
- #C10 = <self::E*>[#C3, #C6, #C9]
+ #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+ #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
}
Constructor coverage from constants:
org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10: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:///entries_with_type_arguments.dart:11:9)
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 584e232..718544d 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
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];
- static const field self::E one = const self::E::•(0, "one");
- static const field self::E two = const self::E::•(1, "two");
- static const field self::E three = const self::E::•(2, "three");
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = const <self::E<dynamic, dynamic>>[self::E::one, self::E::two, self::E::three];
+ 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);
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,8 +21,8 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"})
-Extra constant evaluation: evaluated: 9, effectively constant: 4
+Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E<dynamic, dynamic>*>[const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"}, const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"}, const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 11, effectively constant: 4
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 5081c27..fbd0a6f 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
@@ -1,26 +1,17 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.named(int value);
-// ^^^^^
-//
import self as self;
import "dart:core" as core;
-class E extends core::_Enum /*isEnum*/ {
- static const field core::List<self::E> values = #C10;
- static const field self::E one = #C3;
- static const field self::E two = #C6;
- static const field self::E three = #C9;
- const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+ 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;
+ const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
: super core::_Enum::•(index, name)
;
- const constructor named(core::int value) → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.named(int value);
- ^^^^^"
+ const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+ : super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
constants {
#C1 = 0
#C2 = "one"
- #C3 = self::E {index:#C1, _name:#C2}
+ #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
#C4 = 1
#C5 = "two"
- #C6 = self::E {index:#C4, _name:#C5}
+ #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
#C7 = 2
#C8 = "three"
- #C9 = self::E {index:#C7, _name:#C8}
- #C10 = <self::E*>[#C3, #C6, #C9]
+ #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+ #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
}
Constructor coverage from constants:
org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10: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:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
new file mode 100644
index 0000000..6afc407
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
@@ -0,0 +1,19 @@
+// 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.
+
+X foo<X>(X x) => x;
+
+enum E1 {
+ bar(foo);
+
+ const E1(int Function(int) f);
+}
+
+enum E2<X> {
+ bar(foo);
+
+ const E2(X f);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
new file mode 100644
index 0000000..cdcb164
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = #C4;
+ static const field self::E1 bar = #C3;
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = #C6;
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ return x;
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "bar"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = <self::E1>[#C3]
+ #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
+ #C6 = <self::E2<dynamic>>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10: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)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..cdcb164
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = #C4;
+ static const field self::E1 bar = #C3;
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = #C6;
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ return x;
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "bar"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = <self::E1>[#C3]
+ #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
+ #C6 = <self::E2<dynamic>>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10: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)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..9f80f5b
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+X foo<X>(X x) => x;
+enum E1 { bar(foo); const E1(int Function(int) f); }
+enum E2<X> { bar(foo); const E2(X f); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = #C4;
+ static const field self::E1 bar = #C3;
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = #C6;
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ return x;
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "bar"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = <self::E1*>[#C3]
+ #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+ #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10: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)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = #C4;
+ static const field self::E1 bar = #C3;
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = #C6;
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ return x;
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "bar"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = <self::E1*>[#C3]
+ #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+ #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10: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)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..2a59034
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+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::bar];
+ static const field self::E1 bar = const self::E1::•(0, "bar", self::foo<core::int>);
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = const <self::E2<dynamic>>[self::E2::bar];
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = const self::E2::•<<X extends core::Object? = dynamic>(X%) → X%>(0, "bar", self::foo);
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:7:6 -> ListConstant(const <E1*>[const E1{_Enum.index: 0, _Enum._name: "bar"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:8:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "bar"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:13:6 -> ListConstant(const <E2<dynamic>*>[const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:14:3 -> InstanceConstant(const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"})
+Extra constant evaluation: evaluated: 14, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = #C4;
+ static const field self::E1 bar = #C3;
+ const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2<dynamic>> values = #C6;
+ static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+ const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+ return x;
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "bar"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = <self::E1*>[#C3]
+ #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+ #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10: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)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
index 43b585e..ffb1eca 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E a = #C3;
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
@@ -35,6 +23,6 @@
Constructor coverage from constants:
org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8: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)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
index 43b585e..ffb1eca 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E a = #C3;
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
@@ -35,6 +23,6 @@
Constructor coverage from constants:
org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8: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)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E a = #C3;
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
@@ -35,6 +23,6 @@
Constructor coverage from constants:
org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8: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)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E a = #C3;
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
@@ -35,6 +23,6 @@
Constructor coverage from constants:
org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8: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)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
index b0ba4b4..cf85d8d 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
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::a];
- static const field self::E a = const self::E::•(0, "a");
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ static const field self::E a = const self::E::b(0, "a");
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
@@ -1,23 +1,11 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-// const E.b();
-// ^
-//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E a = #C3;
- const constructor b() → self::E
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
- const E.b();
- ^"
- ;
- const constructor •(core::int index, core::String name) → self::E
+ const constructor b(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
@@ -35,6 +23,6 @@
Constructor coverage from constants:
org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8: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)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index db22169c..bc8ab91 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -29,6 +29,7 @@
dart2js/late_fields: FormatterCrash
dart2js/late_statics: FormatterCrash
enhanced_enums/entries_with_type_arguments: FormatterCrash
+enhanced_enums/inference_in_constructor_parameters: FormatterCrash
enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
extension_types/basic_show: FormatterCrash
extension_types/call_not_get: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 393bdb2..0516db1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 16
PATCH 0
-PRERELEASE 143
+PRERELEASE 144
PRERELEASE_PATCH 0
\ No newline at end of file