| Index: pkg/compiler/lib/src/kernel/kernel.dart
|
| diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
|
| index 964854ac39669680d872175ca1f981460bd51236..eb671eb5e115f63d5a37f24a55bb4ca6f98cd4a3 100644
|
| --- a/pkg/compiler/lib/src/kernel/kernel.dart
|
| +++ b/pkg/compiler/lib/src/kernel/kernel.dart
|
| @@ -152,10 +152,18 @@ class Kernel {
|
| Queue<ir.Member> members = new Queue<ir.Member>();
|
| library.implementation.forEachLocalMember((Element e) {
|
| if (e.isClass) {
|
| - classes.addFirst(classToIr(e));
|
| + ClassElement cls = e;
|
| + if (!cls.isResolved) return;
|
| + classes.addFirst(classToIr(cls));
|
| } else if (e.isFunction || e.isAccessor) {
|
| + if (!compiler.resolution.hasBeenResolved(e) && !e.isMalformed) {
|
| + return;
|
| + }
|
| members.addFirst(functionToIr(e));
|
| } else if (e.isField) {
|
| + if (!compiler.resolution.hasBeenResolved(e) && !e.isMalformed) {
|
| + return;
|
| + }
|
| members.addFirst(fieldToIr(e));
|
| } else if (e.isTypedef) {
|
| // Ignored, typedefs are unaliased on use.
|
| @@ -188,8 +196,7 @@ class Kernel {
|
| ir.Class classToIr(ClassElement cls) {
|
| cls = cls.declaration;
|
| return classes.putIfAbsent(cls, () {
|
| - cls.ensureResolved(compiler.resolution);
|
| - compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
|
| + assert(cls.isResolved);
|
| String name = computeName(cls);
|
| ir.Class classNode = new ir.Class(
|
| name: name,
|
| @@ -213,6 +220,10 @@ class Kernel {
|
| }
|
| cls.implementation
|
| .forEachMember((ClassElement enclosingClass, Element member) {
|
| + if (!compiler.resolution.hasBeenResolved(member)
|
| + && !member.isMalformed) {
|
| + return;
|
| + }
|
| if (member.enclosingClass.declaration != cls) {
|
| // TODO(het): figure out why impact_test triggers this
|
| //internalError(cls, "`$member` isn't mine.");
|
| @@ -409,8 +420,8 @@ class Kernel {
|
| }
|
| function = function.declaration;
|
| return functions.putIfAbsent(function, () {
|
| - compiler.resolution.ensureResolved(function);
|
| - compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
|
| + assert(compiler.resolution.hasBeenResolved(function) ||
|
| + function.isMalformed);
|
| function = function.implementation;
|
| ir.Member member;
|
| ir.Constructor constructor;
|
| @@ -509,8 +520,13 @@ class Kernel {
|
| }
|
| field = field.declaration;
|
| return fields.putIfAbsent(field, () {
|
| + // TODO(sigmund): remove `ensureResolved` here. It appears we hit this
|
| + // case only in metadata: when a constant has a field that is never read,
|
| + // but it is initialized in the constant constructor.
|
| compiler.resolution.ensureResolved(field);
|
| compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
|
| + assert(compiler.resolution.hasBeenResolved(field) || field.isMalformed);
|
| +
|
| field = field.implementation;
|
| ir.DartType type =
|
| field.isMalformed ? const ir.InvalidType() : typeToIr(field.type);
|
| @@ -552,7 +568,7 @@ class Kernel {
|
| addWork(variable, () {
|
| if (variable.typeDeclaration.isClass) {
|
| ClassElement cls = variable.typeDeclaration;
|
| - cls.ensureResolved(compiler.resolution);
|
| + assert(cls.isResolved);
|
| parameter.parent = classToIr(cls);
|
| } else {
|
| FunctionElement method = variable.typeDeclaration;
|
| @@ -688,12 +704,14 @@ class Kernel {
|
| LibraryElement library =
|
| compiler.libraryLoader.lookupLibrary(Uris.dart_core);
|
| ClassElement cls = library.implementation.localLookup(className);
|
| + cls.ensureResolved(compiler.resolution);
|
| assert(invariant(CURRENT_ELEMENT_SPANNABLE, cls != null,
|
| message: 'dart:core class $className not found.'));
|
| ConstructorElement constructor = cls.lookupConstructor(constructorName);
|
| assert(invariant(CURRENT_ELEMENT_SPANNABLE, constructor != null,
|
| message: "Constructor '$constructorName' not found "
|
| "in class '$className'."));
|
| + compiler.resolution.ensureResolved(constructor);
|
| return functionToIr(constructor);
|
| }
|
|
|
| @@ -703,6 +721,7 @@ class Kernel {
|
| Element function = library.implementation.localLookup(name);
|
| assert(invariant(CURRENT_ELEMENT_SPANNABLE, function != null,
|
| message: "dart:core method '$name' not found."));
|
| + compiler.resolution.ensureResolved(function);
|
| return functionToIr(function);
|
| }
|
|
|
|
|