Index: dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart b/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
index a1a2ed2533e485fea898cd4e681b02d854adb746..736732c97f428908ac752ffa1405729126545d77 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
@@ -62,7 +62,6 @@ class EnqueueTask extends CompilerTask { |
compiler.libraries.values.forEach(addMemberByName); |
} |
- |
String get name => 'Enqueue'; |
EnqueueTask(Compiler compiler) |
@@ -95,6 +94,8 @@ abstract class Enqueuer { |
EnqueueTask task; |
native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask |
+ bool hasEnqueuedEverything = false; |
+ |
Enqueuer(this.name, this.compiler, |
ItemCompilationContext itemCompilationContextCreator()) |
: this.itemCompilationContextCreator = itemCompilationContextCreator; |
@@ -342,40 +343,42 @@ abstract class Enqueuer { |
for (var link = task.allElementsByName[name]; |
link != null && !link.isEmpty; |
link = link.tail) { |
- Element element = link.head; |
- if (Elements.isUnresolved(element)) { |
- // Ignore. |
- } else if (element.isConstructor()) { |
- ClassElement cls = element.declaration.getEnclosingClass(); |
- registerInstantiatedType(cls.rawType, elements); |
- registerStaticUse(element.declaration); |
- } else if (element.impliesType()) { |
- // Don't enqueue classes, typedefs, and type variables. |
- } else if (Elements.isStaticOrTopLevel(element)) { |
- registerStaticUse(element.declaration); |
- } else if (element.isInstanceMember()) { |
- if (element.isFunction()) { |
- int arity = |
- element.asFunctionElement().requiredParameterCount(compiler); |
- Selector selector = |
- new Selector.call(element.name, element.getLibrary(), arity); |
- registerInvocation(element.name, selector); |
- } else if (element.isSetter()) { |
- Selector selector = |
- new Selector.setter(element.name, element.getLibrary()); |
- registerInvokedSetter(element.name, selector); |
- } else if (element.isGetter()) { |
- Selector selector = |
- new Selector.getter(element.name, element.getLibrary()); |
- registerInvokedGetter(element.name, selector); |
- } else if (element.isField()) { |
- Selector selector = |
- new Selector.setter(element.name, element.getLibrary()); |
- registerInvokedSetter(element.name, selector); |
- selector = |
- new Selector.getter(element.name, element.getLibrary()); |
- registerInvokedGetter(element.name, selector); |
- } |
+ pretendElementWasUsed(link.head, elements); |
+ } |
+ } |
+ |
+ void pretendElementWasUsed(Element element, TreeElements elements) { |
+ if (Elements.isUnresolved(element)) { |
+ // Ignore. |
+ } else if (element.isConstructor()) { |
+ ClassElement cls = element.declaration.getEnclosingClass(); |
+ registerInstantiatedType(cls.rawType, elements); |
+ registerStaticUse(element.declaration); |
+ } else if (element.impliesType()) { |
+ // Don't enqueue classes, typedefs, and type variables. |
+ } else if (Elements.isStaticOrTopLevel(element)) { |
+ registerStaticUse(element.declaration); |
+ } else if (element.isInstanceMember()) { |
+ if (element.isFunction()) { |
+ int arity = |
+ element.asFunctionElement().requiredParameterCount(compiler); |
+ Selector selector = |
+ new Selector.call(element.name, element.getLibrary(), arity); |
+ registerInvocation(element.name, selector); |
+ } else if (element.isSetter()) { |
+ Selector selector = |
+ new Selector.setter(element.name, element.getLibrary()); |
+ registerInvokedSetter(element.name, selector); |
+ } else if (element.isGetter()) { |
+ Selector selector = |
+ new Selector.getter(element.name, element.getLibrary()); |
+ registerInvokedGetter(element.name, selector); |
+ } else if (element.isField()) { |
+ Selector selector = |
+ new Selector.setter(element.name, element.getLibrary()); |
+ registerInvokedSetter(element.name, selector); |
+ selector = new Selector.getter(element.name, element.getLibrary()); |
+ registerInvokedGetter(element.name, selector); |
} |
} |
} |
@@ -384,6 +387,18 @@ abstract class Enqueuer { |
void registerNewSymbol(TreeElements elements) { |
} |
+ void enqueueEverything() { |
+ if (hasEnqueuedEverything) return; |
+ compiler.log('Enqueuing everything'); |
+ task.ensureAllElementsByName(); |
+ for (Link link in task.allElementsByName.values) { |
+ for (Element element in link) { |
+ pretendElementWasUsed(element, compiler.globalDependencies); |
+ } |
+ } |
+ hasEnqueuedEverything = true; |
+ } |
+ |
processLink(Map<String, Link<Element>> map, |
SourceString n, |
bool f(Element e)) { |
@@ -456,6 +471,7 @@ abstract class Enqueuer { |
if (element == null) return; |
assert(invariant(element, element.isDeclaration)); |
addToWorkList(element); |
+ compiler.backend.registerStaticUse(element, this); |
} |
void registerGetOfStaticFunction(FunctionElement element) { |