Index: pkg/compiler/lib/src/enqueue.dart |
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart |
index f619520adef080da96da34cdac3c4a4add5f5534..29ae8ea4bf6c57ea145bff92b1a3d85aba559c2a 100644 |
--- a/pkg/compiler/lib/src/enqueue.dart |
+++ b/pkg/compiler/lib/src/enqueue.dart |
@@ -10,7 +10,7 @@ import 'common/codegen.dart' show CodegenWorkItem; |
import 'common/names.dart' show Identifiers; |
import 'common/resolution.dart' show Resolution; |
import 'common/resolution.dart' show ResolutionWorkItem; |
-import 'common/tasks.dart' show CompilerTask, DeferredAction, DeferredTask; |
+import 'common/tasks.dart' show CompilerTask; |
import 'common/work.dart' show ItemCompilationContext, WorkItem; |
import 'common.dart'; |
import 'compiler.dart' show Compiler; |
@@ -46,11 +46,13 @@ typedef ItemCompilationContext ItemCompilationContextCreator(); |
class EnqueueTask extends CompilerTask { |
final ResolutionEnqueuer resolution; |
final CodegenEnqueuer codegen; |
+ final Compiler compiler; |
String get name => 'Enqueue'; |
EnqueueTask(Compiler compiler) |
- : resolution = new ResolutionEnqueuer( |
+ : compiler = compiler, |
+ resolution = new ResolutionEnqueuer( |
compiler, |
compiler.backend.createItemCompilationContext, |
compiler.options.analyzeOnly && compiler.options.analyzeMain |
@@ -60,7 +62,7 @@ class EnqueueTask extends CompilerTask { |
compiler, |
compiler.backend.createItemCompilationContext, |
const TreeShakingEnqueuerStrategy()), |
- super(compiler) { |
+ super(compiler.measurer) { |
codegen.task = this; |
resolution.task = this; |
@@ -714,11 +716,9 @@ class ResolutionEnqueuer extends Enqueuer { |
final Queue<ResolutionWorkItem> queue; |
- /** |
- * A deferred task queue for the resolution phase which is processed |
- * when the resolution queue has been emptied. |
- */ |
- final Queue<DeferredTask> deferredTaskQueue; |
+ /// Queue of deferred resolution actions to execute when the resolution queue |
+ /// has been emptied. |
+ final Queue<_DeferredAction> deferredQueue; |
static const ImpactUseCase IMPACT_USE = |
const ImpactUseCase('ResolutionEnqueuer'); |
@@ -733,7 +733,7 @@ class ResolutionEnqueuer extends Enqueuer { |
strategy), |
processedElements = new Set<AstElement>(), |
queue = new Queue<ResolutionWorkItem>(), |
- deferredTaskQueue = new Queue<DeferredTask>(); |
+ deferredQueue = new Queue<_DeferredAction>(); |
bool get isResolutionQueue => true; |
@@ -831,24 +831,26 @@ class ResolutionEnqueuer extends Enqueuer { |
* |
* The queue is processed in FIFO order. |
*/ |
- void addDeferredAction(Element element, DeferredAction action) { |
+ void addDeferredAction(Element element, void action()) { |
if (queueIsClosed) { |
throw new SpannableAssertionFailure( |
element, |
"Resolution work list is closed. " |
"Trying to add deferred action for $element"); |
} |
- deferredTaskQueue.add(new DeferredTask(element, action)); |
+ deferredQueue.add(new _DeferredAction(element, action)); |
} |
bool onQueueEmpty(Iterable<ClassElement> recentClasses) { |
- emptyDeferredTaskQueue(); |
+ _emptyDeferredQueue(); |
return super.onQueueEmpty(recentClasses); |
} |
- void emptyDeferredTaskQueue() { |
- while (!deferredTaskQueue.isEmpty) { |
- DeferredTask task = deferredTaskQueue.removeFirst(); |
+ void emptyDeferredQueueForTesting() => _emptyDeferredQueue(); |
+ |
+ void _emptyDeferredQueue() { |
+ while (!deferredQueue.isEmpty) { |
+ _DeferredAction task = deferredQueue.removeFirst(); |
reporter.withCurrentElement(task.element, task.action); |
} |
} |
@@ -1044,3 +1046,12 @@ class _EnqueuerImpactVisitor implements WorldImpactVisitor { |
enqueuer.registerTypeUse(typeUse); |
} |
} |
+ |
+typedef void _DeferredActionFunction(); |
+ |
+class _DeferredAction { |
+ final Element element; |
+ final _DeferredActionFunction action; |
+ |
+ _DeferredAction(this.element, this.action); |
+} |