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 ea33e1870e7d5cd1093366f04763218528bcca82..fbb3a9abfbda5ef5f0d55414f527837d4a10b32f 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart |
@@ -81,10 +81,9 @@ import 'kernel_builder.dart' |
KernelProcedureBuilder, |
LibraryBuilder, |
MemberBuilder, |
- MixinApplicationBuilder, |
- NamedMixinApplicationBuilder, |
NamedTypeBuilder, |
TypeBuilder, |
+ TypeDeclarationBuilder, |
TypeVariableBuilder; |
import 'verifier.dart' show verifyProgram; |
@@ -148,33 +147,34 @@ class KernelTarget extends TargetImplementation { |
return new KernelLibraryBuilder(uri, fileUri, loader); |
} |
- void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) { |
- if (cls == null) return; |
+ void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) { |
TypeBuilder supertype = cls.supertype; |
- add(NamedTypeBuilder type) { |
- Builder builder = type.builder; |
- if (builder is ClassBuilder) { |
- set.add(builder); |
- } |
- } |
- |
- if (supertype == null) { |
- // OK. |
- } else if (supertype is MixinApplicationBuilder) { |
- add(supertype.supertype); |
- for (NamedTypeBuilder t in supertype.mixins) { |
- add(t); |
- } |
- } else if (supertype is NamedTypeBuilder) { |
- add(supertype); |
- } else { |
+ if (supertype is NamedTypeBuilder) { |
+ f(supertype); |
+ } else if (supertype != null) { |
internalError("Unhandled: ${supertype.runtimeType}"); |
} |
if (cls.interfaces != null) { |
for (NamedTypeBuilder t in cls.interfaces) { |
- add(t); |
+ f(t); |
} |
} |
+ if (cls.library.loader == loader && |
+ // TODO(ahe): Implement DillClassBuilder.mixedInType and remove the |
+ // above check. |
+ cls.mixedInType != null) { |
+ f(cls.mixedInType); |
+ } |
+ } |
+ |
+ void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) { |
+ if (cls == null) return; |
+ forEachDirectSupertype(cls, (NamedTypeBuilder type) { |
+ Builder builder = type.builder; |
+ if (builder is ClassBuilder) { |
+ set.add(builder); |
+ } |
+ }); |
} |
List<ClassBuilder> collectAllClasses() { |
@@ -214,6 +214,7 @@ class KernelTarget extends TargetImplementation { |
builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri)) |
..builder = objectClassBuilder; |
builder.interfaces = null; |
+ builder.mixedInType = null; |
} |
Future<Program> handleInputError(Uri uri, InputError error, |
@@ -240,8 +241,8 @@ class KernelTarget extends TargetImplementation { |
loader.resolveParts(); |
loader.computeLibraryScopes(); |
loader.resolveTypes(); |
- loader.buildProgram(); |
loader.checkSemantics(); |
+ loader.buildProgram(); |
List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); |
installDefaultSupertypes(); |
installDefaultConstructors(sourceClasses); |
@@ -447,19 +448,13 @@ class KernelTarget extends TargetImplementation { |
/// If [builder] doesn't have a constructors, install the defaults. |
void installDefaultConstructor(SourceClassBuilder builder) { |
- if (builder.cls.isMixinApplication) { |
- // We have to test if builder.cls is a mixin application. [builder] may |
- // think it's a mixin application, but if its mixed-in type couldn't be |
- // resolved, the target class won't be a mixin application and we need |
- // to add a default constructor to complete error recovery. |
- return; |
- } |
+ if (builder.isMixinApplication && !builder.isNamedMixinApplication) return; |
if (builder.constructors.local.isNotEmpty) return; |
/// Quotes below are from [Dart Programming Language Specification, 4th |
/// Edition]( |
/// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf): |
- if (builder is NamedMixinApplicationBuilder) { |
+ if (builder.isNamedMixinApplication) { |
/// >A mixin application of the form S with M; defines a class C with |
/// >superclass S. |
/// >... |
@@ -469,14 +464,10 @@ class KernelTarget extends TargetImplementation { |
/// >that is accessible to LM , C has an implicitly declared constructor |
/// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) : |
/// >super(ai1,...,aiki);. |
- Builder supertype = builder; |
- while (supertype is NamedMixinApplicationBuilder) { |
- NamedMixinApplicationBuilder named = supertype; |
- TypeBuilder type = named.mixinApplication; |
- if (type is MixinApplicationBuilder) { |
- MixinApplicationBuilder t = type; |
- type = t.supertype; |
- } |
+ TypeDeclarationBuilder supertype = builder; |
+ while (supertype.isMixinApplication) { |
+ SourceClassBuilder named = supertype; |
+ TypeBuilder type = named.supertype; |
if (type is NamedTypeBuilder) { |
supertype = type.builder; |
} else { |