Index: pkg/compiler/lib/src/compiler.dart |
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart |
index 65d269cb85c32d5bfd6c39cf2e3f5805f38b99a4..b78d3f6ac36ba041149d95674bd8de81c4017a6a 100644 |
--- a/pkg/compiler/lib/src/compiler.dart |
+++ b/pkg/compiler/lib/src/compiler.dart |
@@ -32,7 +32,7 @@ abstract class WorkItem { |
assert(invariant(element, element.isDeclaration)); |
} |
- void run(Compiler compiler, Enqueuer world); |
+ WorldImpact run(Compiler compiler, Enqueuer world); |
} |
/// [WorkItem] used exclusively by the [ResolutionEnqueuer]. |
@@ -43,9 +43,10 @@ class ResolutionWorkItem extends WorkItem { |
ItemCompilationContext compilationContext) |
: super(element, compilationContext); |
- void run(Compiler compiler, ResolutionEnqueuer world) { |
- compiler.analyze(this, world); |
+ WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { |
+ WorldImpact impact = compiler.analyze(this, world); |
resolutionTree = element.resolvedAst.elements; |
+ return impact; |
} |
bool isAnalyzed() => resolutionTree != null; |
@@ -81,7 +82,7 @@ class CodegenRegistry extends Registry { |
} |
void registerInstantiatedClass(ClassElement element) { |
- world.registerInstantiatedClass(element, this); |
+ world.registerInstantiatedType(element.rawType, this); |
} |
void registerInstantiatedType(InterfaceType type) { |
@@ -120,7 +121,7 @@ class CodegenRegistry extends Registry { |
} |
void registerIsCheck(DartType type) { |
- world.registerIsCheck(type, this); |
+ world.registerIsCheck(type); |
backend.registerIsCheckForCodegen(type, world, this); |
} |
@@ -186,7 +187,7 @@ class CodegenRegistry extends Registry { |
/// [WorkItem] used exclusively by the [CodegenEnqueuer]. |
class CodegenWorkItem extends WorkItem { |
- Registry registry; |
+ CodegenRegistry registry; |
factory CodegenWorkItem( |
Compiler compiler, |
@@ -211,11 +212,11 @@ class CodegenWorkItem extends WorkItem { |
TreeElements get resolutionTree => element.resolvedAst.elements; |
- void run(Compiler compiler, CodegenEnqueuer world) { |
- if (world.isProcessed(element)) return; |
+ WorldImpact run(Compiler compiler, CodegenEnqueuer world) { |
+ if (world.isProcessed(element)) return const WorldImpact(); |
registry = new CodegenRegistry(compiler, resolutionTree); |
- compiler.codegen(this, world); |
+ return compiler.codegen(this, world); |
} |
} |
@@ -249,8 +250,6 @@ abstract class Registry { |
void registerInstantiation(InterfaceType type); |
void registerGetOfStaticFunction(FunctionElement element); |
- |
- void registerAsyncMarker(FunctionElement element); |
} |
abstract class Backend { |
@@ -287,7 +286,7 @@ abstract class Backend { |
void initializeHelperClasses() {} |
void enqueueHelpers(ResolutionEnqueuer world, Registry registry); |
- void codegen(CodegenWorkItem work); |
+ WorldImpact codegen(CodegenWorkItem work); |
// The backend determines the native resolution enqueuer, with a no-op |
// default, so tools like dart2dart can ignore the native classes. |
@@ -1698,7 +1697,7 @@ abstract class Compiler implements DiagnosticListener { |
ClassElement cls = element; |
cls.ensureResolved(this); |
cls.forEachLocalMember(enqueuer.resolution.addToWorkList); |
- world.registerInstantiatedClass(element, globalDependencies); |
+ world.registerInstantiatedType(cls.rawType, globalDependencies); |
} else { |
world.addToWorkList(element); |
} |
@@ -1723,10 +1722,12 @@ abstract class Compiler implements DiagnosticListener { |
FunctionElement mainMethod = main; |
if (mainMethod.computeSignature(this).parameterCount != 0) { |
// The first argument could be a list of strings. |
- world.registerInstantiatedClass( |
- backend.listImplementation, globalDependencies); |
- world.registerInstantiatedClass( |
- backend.stringImplementation, globalDependencies); |
+ backend.listImplementation.ensureResolved(this); |
+ world.registerInstantiatedType( |
+ backend.listImplementation.rawType, globalDependencies); |
+ backend.stringImplementation.ensureResolved(this); |
+ world.registerInstantiatedType( |
+ backend.stringImplementation.rawType, globalDependencies); |
backend.registerMainHasArguments(world); |
} |
@@ -1736,7 +1737,9 @@ abstract class Compiler implements DiagnosticListener { |
progress.reset(); |
} |
world.forEach((WorkItem work) { |
- withCurrentElement(work.element, () => work.run(this, world)); |
+ withCurrentElement(work.element, () { |
+ world.applyImpact(work.element, work.run(this, world)); |
+ }); |
}); |
world.queueIsClosed = true; |
assert(compilationFailed || world.checkNoEnqueuedInvokedInstanceMethods()); |
@@ -1782,7 +1785,7 @@ abstract class Compiler implements DiagnosticListener { |
} |
} |
- void analyzeElement(Element element) { |
+ WorldImpact analyzeElement(Element element) { |
assert(invariant(element, |
element.impliesType || |
element.isField || |
@@ -1795,22 +1798,23 @@ abstract class Compiler implements DiagnosticListener { |
message: 'Element $element is not analyzable.')); |
assert(invariant(element, element.isDeclaration)); |
ResolutionEnqueuer world = enqueuer.resolution; |
- if (world.hasBeenResolved(element)) return; |
+ if (world.hasBeenResolved(element)) { |
+ return const WorldImpact(); |
+ } |
assert(parser != null); |
Node tree = parser.parse(element); |
assert(invariant(element, !element.isSynthesized || tree == null)); |
- TreeElements elements = resolver.resolve(element); |
- if (elements != null) { |
- if (tree != null && !analyzeSignaturesOnly && |
- !suppressWarnings) { |
- // Only analyze nodes with a corresponding [TreeElements]. |
- checker.check(elements); |
- } |
- world.registerResolvedElement(element); |
+ WorldImpact worldImpact = resolver.resolve(element); |
+ if (tree != null && !analyzeSignaturesOnly && |
+ !suppressWarnings) { |
+ // Only analyze nodes with a corresponding [TreeElements]. |
+ checker.check(element); |
} |
+ world.registerResolvedElement(element); |
+ return worldImpact; |
} |
- void analyze(ResolutionWorkItem work, ResolutionEnqueuer world) { |
+ WorldImpact analyze(ResolutionWorkItem work, ResolutionEnqueuer world) { |
assert(invariant(work.element, identical(world, enqueuer.resolution))); |
assert(invariant(work.element, !work.isAnalyzed(), |
message: 'Element ${work.element} has already been analyzed')); |
@@ -1824,12 +1828,15 @@ abstract class Compiler implements DiagnosticListener { |
} |
} |
AstElement element = work.element; |
- if (world.hasBeenResolved(element)) return; |
- analyzeElement(element); |
+ if (world.hasBeenResolved(element)) { |
+ return const WorldImpact(); |
+ } |
+ WorldImpact worldImpact = analyzeElement(element); |
backend.onElementResolved(element, element.resolvedAst.elements); |
+ return worldImpact; |
} |
- void codegen(CodegenWorkItem work, CodegenEnqueuer world) { |
+ WorldImpact codegen(CodegenWorkItem work, CodegenEnqueuer world) { |
assert(invariant(work.element, identical(world, enqueuer.codegen))); |
if (shouldPrintProgress) { |
// TODO(ahe): Add structured diagnostics to the compiler API and |
@@ -1837,7 +1844,7 @@ abstract class Compiler implements DiagnosticListener { |
log('Compiled ${enqueuer.codegen.generatedCode.length} methods.'); |
progress.reset(); |
} |
- backend.codegen(work); |
+ return backend.codegen(work); |
} |
void reportError(Spannable node, |