| Index: pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
|
| index 2abba433b4e3839b276cc50f741d50512a0fd145..1083a50c916c1218086988c00fcf9ae12b7979ed 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
|
| @@ -30,7 +30,6 @@ import 'package:kernel/ast.dart'
|
| NullLiteral,
|
| ProcedureKind,
|
| Program,
|
| - RedirectingInitializer,
|
| Source,
|
| StringLiteral,
|
| SuperInitializer,
|
| @@ -83,6 +82,7 @@ import 'kernel_builder.dart'
|
| KernelNamedTypeBuilder,
|
| KernelProcedureBuilder,
|
| LibraryBuilder,
|
| + MemberBuilder,
|
| MixinApplicationBuilder,
|
| NamedMixinApplicationBuilder,
|
| NamedTypeBuilder,
|
| @@ -355,7 +355,7 @@ class KernelTarget extends TargetImplementation {
|
| mainBuilder.body = new ExpressionStatement(
|
| new Throw(new StringLiteral("${errors.join('\n')}")));
|
| }
|
| - library.build();
|
| + library.build(loader.coreLibrary);
|
| return link(<Library>[library.library]);
|
| }
|
|
|
| @@ -562,7 +562,7 @@ class KernelTarget extends TargetImplementation {
|
| for (SourceClassBuilder builder in collectAllSourceClasses()) {
|
| Class cls = builder.target;
|
| if (cls != objectClass) {
|
| - finishConstructors(cls);
|
| + finishConstructors(builder);
|
| }
|
| }
|
| ticker.logMs("Finished constructors");
|
| @@ -570,10 +570,11 @@ class KernelTarget extends TargetImplementation {
|
|
|
| /// Ensure constructors of [cls] have the correct initializers and other
|
| /// requirements.
|
| - void finishConstructors(Class cls) {
|
| + void finishConstructors(SourceClassBuilder builder) {
|
| + Class cls = builder.target;
|
| +
|
| /// Quotes below are from [Dart Programming Language Specification, 4th
|
| /// Edition](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
|
| - Constructor superTarget;
|
| List<Field> uninitializedFields = <Field>[];
|
| List<Field> nonFinalFields = <Field>[];
|
| for (Field field in cls.fields) {
|
| @@ -586,12 +587,16 @@ class KernelTarget extends TargetImplementation {
|
| }
|
| Map<Constructor, List<FieldInitializer>> fieldInitializers =
|
| <Constructor, List<FieldInitializer>>{};
|
| - for (Constructor constructor in cls.constructors) {
|
| - if (!isRedirectingGenerativeConstructor(constructor)) {
|
| + Constructor superTarget;
|
| + builder.constructors.forEach((String name, Builder member) {
|
| + if (member.isFactory) return;
|
| + MemberBuilder constructorBuilder = member;
|
| + Constructor constructor = constructorBuilder.target;
|
| + if (!constructorBuilder.isRedirectingGenerativeConstructor) {
|
| /// >If no superinitializer is provided, an implicit superinitializer
|
| /// >of the form super() is added at the end of k’s initializer list,
|
| /// >unless the enclosing class is class Object.
|
| - if (!constructor.initializers.any(isSuperinitializerOrInvalid)) {
|
| + if (constructor.initializers.isEmpty) {
|
| superTarget ??= defaultSuperConstructor(cls);
|
| Initializer initializer;
|
| if (superTarget == null) {
|
| @@ -632,7 +637,7 @@ class KernelTarget extends TargetImplementation {
|
| nonFinalFields.clear();
|
| }
|
| }
|
| - }
|
| + });
|
| Set<Field> initializedFields;
|
| fieldInitializers.forEach(
|
| (Constructor constructor, List<FieldInitializer> initializers) {
|
| @@ -696,16 +701,6 @@ class KernelTarget extends TargetImplementation {
|
| }
|
| }
|
|
|
| -bool isSuperinitializerOrInvalid(Initializer initializer) {
|
| - return initializer is SuperInitializer || initializer is InvalidInitializer;
|
| -}
|
| -
|
| -bool isRedirectingGenerativeConstructor(Constructor constructor) {
|
| - List<Initializer> initializers = constructor.initializers;
|
| - return initializers.length == 1 &&
|
| - initializers.single is RedirectingInitializer;
|
| -}
|
| -
|
| /// Looks for a constructor call that matches `super()` from a constructor in
|
| /// [cls]. Such a constructor may have optional arguments, but no required
|
| /// arguments.
|
|
|