Index: sdk/lib/_internal/compiler/implementation/compiler.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart |
index 774c2c6ea2ee79119c8b246b669bb2a8f42aed93..7b5569f4d7749e172ec351ad91a77752e84f35e1 100644 |
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart |
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart |
@@ -74,8 +74,12 @@ abstract class Backend { |
void enqueueHelpers(Enqueuer world); |
void codegen(WorkItem work); |
- void processNativeClasses(Enqueuer world, |
- Collection<LibraryElement> libraries); |
+ |
+ // The backend determines the native resolution enqueuer so tools like |
+ // dart2dart can ignore the native classes. |
+ NativeEnqueuer nativeResolutionEnqueuer(world); |
+ NativeEnqueuer nativeCodegenEnqueuer(world); |
+ |
void assembleProgram(); |
List<CompilerTask> get tasks; |
@@ -521,11 +525,18 @@ abstract class Compiler implements DiagnosticListener { |
}); |
} |
+ enqueuer.resolution.nativeEnqueuer = |
+ backend.nativeResolutionEnqueuer(enqueuer.resolution); |
+ enqueuer.codegen.nativeEnqueuer = |
+ backend.nativeCodegenEnqueuer(enqueuer.codegen); |
+ |
log('Resolving...'); |
phase = PHASE_RESOLVING; |
backend.enqueueHelpers(enqueuer.resolution); |
processQueue(enqueuer.resolution, main); |
log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
+ log('Resolved ${enqueuer.resolution.nativeEnqueuer.registeredClasses.length} native elements used, ' |
+ '${enqueuer.resolution.nativeEnqueuer.unusedClasses.length} native elements dead.'); |
if (compilationFailed) return; |
@@ -540,6 +551,8 @@ abstract class Compiler implements DiagnosticListener { |
phase = PHASE_COMPILING; |
processQueue(enqueuer.codegen, main); |
log('Compiled ${codegenWorld.generatedCode.length} methods.'); |
+ log('Compiled ${enqueuer.codegen.nativeEnqueuer.registeredClasses.length} native classes, ' |
+ '${enqueuer.codegen.nativeEnqueuer.unusedClasses.length} native classes omitted.'); |
if (compilationFailed) return; |
@@ -549,7 +562,7 @@ abstract class Compiler implements DiagnosticListener { |
} |
void processQueue(Enqueuer world, Element main) { |
- backend.processNativeClasses(world, libraries.values); |
+ world.nativeEnqueuer.processNativeClasses(libraries.values); |
world.addToWorkList(main); |
progress.reset(); |
world.forEach((WorkItem work) { |
@@ -652,6 +665,7 @@ abstract class Compiler implements DiagnosticListener { |
TreeElements result = world.getCachedElements(element); |
if (result != null) return result; |
if (!identical(world, enqueuer.resolution)) { |
+ throw 'Internal error: unresolved element: $element.'; |
internalErrorOnElement(element, |
'Internal error: unresolved element: $element.'); |
} |