Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Unified Diff: pkg/compiler/lib/src/enqueue.dart

Issue 1314973003: Add support for analyzing individual URIs. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/enqueue.dart
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 7be81f2bbd6a1703becbfcec01670be0900fa543..2656ee92da30b2c4307f4e26263651b53f1c1f49 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -68,9 +68,12 @@ class EnqueueTask extends CompilerTask {
EnqueueTask(Compiler compiler)
: resolution = new ResolutionEnqueuer(
- compiler, compiler.backend.createItemCompilationContext),
+ compiler, compiler.backend.createItemCompilationContext,
+ compiler.analyzeOnly && compiler.analyzeMain
+ ? const EnqueuerStrategy() : const TreeShakingEnqueuerStrategy()),
codegen = new CodegenEnqueuer(
- compiler, compiler.backend.createItemCompilationContext),
+ compiler, compiler.backend.createItemCompilationContext,
+ const TreeShakingEnqueuerStrategy()),
super(compiler) {
codegen.task = this;
resolution.task = this;
@@ -111,6 +114,7 @@ class WorldImpact {
abstract class Enqueuer {
final String name;
final Compiler compiler; // TODO(ahe): Remove this dependency.
+ final EnqueuerStrategy strategy;
final ItemCompilationContextCreator itemCompilationContextCreator;
final Map<String, Set<Element>> instanceMembersByName
= new Map<String, Set<Element>>();
@@ -130,7 +134,10 @@ abstract class Enqueuer {
bool hasEnqueuedReflectiveElements = false;
bool hasEnqueuedReflectiveStaticFields = false;
- Enqueuer(this.name, this.compiler, this.itemCompilationContextCreator);
+ Enqueuer(this.name,
+ this.compiler,
+ this.itemCompilationContextCreator,
+ this.strategy);
Queue<WorkItem> get queue;
bool get queueIsEmpty => queue.isEmpty;
@@ -196,7 +203,7 @@ abstract class Enqueuer {
}
void processInstantiatedClassMembers(ClassElement cls) {
- cls.implementation.forEachMember(processInstantiatedClassMember);
+ strategy.processInstantiatedClass(this, cls);
}
void processInstantiatedClassMember(ClassElement cls, Element member) {
@@ -556,6 +563,10 @@ abstract class Enqueuer {
}
void handleUnseenSelector(UniverseSelector universeSelector) {
+ strategy.processSelector(this, universeSelector);
+ }
+
+ void handleUnseenSelectorInternal(UniverseSelector universeSelector) {
Selector selector = universeSelector.selector;
String methodName = selector.name;
processInstanceMembers(methodName, (Element member) {
@@ -604,6 +615,10 @@ abstract class Enqueuer {
*/
void registerStaticUse(Element element) {
if (element == null) return;
+ strategy.processStaticUse(this, element);
+ }
+
+ void registerStaticUseInternal(Element element) {
assert(invariant(element, element.isDeclaration,
message: "Element ${element} is not the declaration."));
if (Elements.isStaticOrTopLevel(element) && element.isField) {
@@ -749,8 +764,12 @@ class ResolutionEnqueuer extends Enqueuer {
final Queue<DeferredTask> deferredTaskQueue;
ResolutionEnqueuer(Compiler compiler,
- ItemCompilationContext itemCompilationContextCreator())
- : super('resolution enqueuer', compiler, itemCompilationContextCreator),
+ ItemCompilationContext itemCompilationContextCreator(),
+ EnqueuerStrategy strategy)
+ : super('resolution enqueuer',
+ compiler,
+ itemCompilationContextCreator,
+ strategy),
resolvedElements = new Set<AstElement>(),
queue = new Queue<ResolutionWorkItem>(),
deferredTaskQueue = new Queue<DeferredTask>();
@@ -913,11 +932,13 @@ class CodegenEnqueuer extends Enqueuer {
bool enabledNoSuchMethod = false;
CodegenEnqueuer(Compiler compiler,
- ItemCompilationContext itemCompilationContextCreator())
+ ItemCompilationContext itemCompilationContextCreator(),
+ EnqueuerStrategy strategy)
: queue = new Queue<CodegenWorkItem>(),
newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
newlySeenSelectors = compiler.cacheStrategy.newSet(),
- super('codegen enqueuer', compiler, itemCompilationContextCreator);
+ super('codegen enqueuer', compiler, itemCompilationContextCreator,
+ strategy);
bool isProcessed(Element member) =>
member.isAbstract || generatedCode.containsKey(member);
@@ -1019,3 +1040,37 @@ void removeFromSet(Map<String, Set<Element>> map, Element element) {
if (set == null) return;
set.remove(element);
}
+
+/// Strategy used by the enqueuer to populate the world.
+// TODO(johnniwinther): Merge this interface with [QueueFilter].
+class EnqueuerStrategy {
+ const EnqueuerStrategy();
+
+ /// Process a class instantiated in live code.
+ void processInstantiatedClass(Enqueuer enqueuer, ClassElement cls) {}
+
+ /// Process an element statically accessed in live code.
+ void processStaticUse(Enqueuer enqueuer, Element element) {}
+
+ /// Process a selector for a call site in live code.
+ void processSelector(Enqueuer enqueuer, UniverseSelector selector) {}
+}
+
+class TreeShakingEnqueuerStrategy implements EnqueuerStrategy {
+ const TreeShakingEnqueuerStrategy();
+
+ @override
+ void processInstantiatedClass(Enqueuer enqueuer, ClassElement cls) {
+ cls.implementation.forEachMember(enqueuer.processInstantiatedClassMember);
+ }
+
+ @override
+ void processStaticUse(Enqueuer enqueuer, Element element) {
+ enqueuer.registerStaticUseInternal(element);
+ }
+
+ @override
+ void processSelector(Enqueuer enqueuer, UniverseSelector selector) {
+ enqueuer.handleUnseenSelectorInternal(selector);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698