Index: pkg/compiler/lib/src/enqueue.dart |
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart |
index ebbef36b1c274fbd11fd75ff30c385e0561d199e..d94476ad811bc5ebfc916a6af345aeb42eadbcc7 100644 |
--- a/pkg/compiler/lib/src/enqueue.dart |
+++ b/pkg/compiler/lib/src/enqueue.dart |
@@ -32,6 +32,27 @@ class EnqueueTask extends CompilerTask { |
} |
} |
+class WorldImpact { |
+ const WorldImpact(); |
+ |
+ Iterable<Selector> get dynamicInvocations => const <Selector>[]; |
+ Iterable<Selector> get dynamicGetters => const <Selector>[]; |
+ Iterable<Selector> get dynamicSetters => const <Selector>[]; |
+ |
+ // TODO(johnniwinther): Split this into more precise subsets. |
+ Iterable<Element> get staticUses => const <Element>[]; |
+ |
+ // TODO(johnniwinther): Replace this by called constructors with type |
+ // arguments. |
+ Iterable<InterfaceType> get instantiatedTypes => const <InterfaceType>[]; |
+ |
+ // TODO(johnniwinther): Collect checked types for checked mode separately to |
+ // support serialization. |
+ Iterable<DartType> get checkedTypes => const <DartType>[]; |
+ |
+ Iterable<MethodElement> get closurizedFunctions => const <MethodElement>[]; |
+} |
+ |
abstract class Enqueuer { |
final String name; |
final Compiler compiler; // TODO(ahe): Remove this dependency. |
@@ -84,6 +105,20 @@ abstract class Enqueuer { |
*/ |
bool internalAddToWorkList(Element element); |
+ /// Apply the [worldImpact] of processing [element] to this enqueuer. |
+ void applyImpact(Element element, WorldImpact worldImpact) { |
+ // TODO(johnniwinther): Optimize the application of the world impact. |
+ worldImpact.dynamicInvocations.forEach(registerDynamicInvocation); |
+ worldImpact.dynamicGetters.forEach(registerDynamicGetter); |
+ worldImpact.dynamicSetters.forEach(registerDynamicSetter); |
+ worldImpact.staticUses.forEach(registerStaticUse); |
+ // TODO(johnniwinther): Register [worldImpact.instantiatedTypes] when it |
+ // doesn't require a [Registry]. |
+ worldImpact.checkedTypes.forEach(registerIsCheck); |
+ worldImpact.closurizedFunctions.forEach(registerGetOfStaticFunction); |
+ } |
+ |
+ // TODO(johnniwinther): Remove the need for passing the [registry]. |
void registerInstantiatedType(InterfaceType type, Registry registry, |
{bool mirrorUsage: false}) { |
task.measure(() { |
@@ -96,12 +131,6 @@ abstract class Enqueuer { |
}); |
} |
- void registerInstantiatedClass(ClassElement cls, Registry registry, |
- {bool mirrorUsage: false}) { |
- cls.ensureResolved(compiler); |
- registerInstantiatedType(cls.rawType, registry, mirrorUsage: mirrorUsage); |
- } |
- |
bool checkNoEnqueuedInvokedInstanceMethods() { |
return filter.checkNoEnqueuedInvokedInstanceMethods(this); |
} |
@@ -350,7 +379,8 @@ abstract class Enqueuer { |
if (includeClass) { |
logEnqueueReflectiveAction(cls, "register"); |
ClassElement decl = cls.declaration; |
- registerInstantiatedClass(decl, compiler.mirrorDependencies, |
+ decl.ensureResolved(compiler); |
+ registerInstantiatedType(decl.rawType, compiler.mirrorDependencies, |
mirrorUsage: true); |
} |
// If the class is never instantiated, we know nothing of it can possibly |
@@ -380,7 +410,8 @@ abstract class Enqueuer { |
for (ClassElement cls in classes) { |
if (compiler.backend.referencedFromMirrorSystem(cls)) { |
logEnqueueReflectiveAction(cls); |
- registerInstantiatedClass(cls, compiler.mirrorDependencies, |
+ cls.ensureResolved(compiler); |
+ registerInstantiatedType(cls.rawType, compiler.mirrorDependencies, |
mirrorUsage: true); |
} |
} |
@@ -564,7 +595,7 @@ abstract class Enqueuer { |
universe.fieldSetters.add(element); |
} |
- void registerIsCheck(DartType type, Registry registry) { |
+ void registerIsCheck(DartType type) { |
type = universe.registerIsCheck(type, compiler); |
// Even in checked mode, type annotations for return type and argument |
// types do not imply type checks, so there should never be a check |