| Index: dart/lib/compiler/implementation/library_loader.dart
|
| diff --git a/dart/lib/compiler/implementation/library_loader.dart b/dart/lib/compiler/implementation/library_loader.dart
|
| index 7d6bef4548fcf18800807db5c956c5f00c76d1c8..e23723b3e97b27bbbd3ad0f01ccd90ac66ea8b43 100644
|
| --- a/dart/lib/compiler/implementation/library_loader.dart
|
| +++ b/dart/lib/compiler/implementation/library_loader.dart
|
| @@ -127,7 +127,7 @@ class LibraryLoaderTask extends LibraryLoader {
|
| String get name => 'LibraryLoader';
|
|
|
| final Map<String, LibraryElement> libraryNames =
|
| - new Map<String, LibraryElement>();
|
| + new LinkedHashMap<String, LibraryElement>();
|
|
|
| LibraryDependencyHandler currentHandler;
|
|
|
| @@ -463,7 +463,8 @@ class LibraryDependencyNode {
|
| * The export scope for [library] which is gradually computed by the work-list
|
| * computation in [LibraryDependencyHandler.computeExports].
|
| */
|
| - Map<SourceString, Element> exportScope = new Map<SourceString, Element>();
|
| + Map<SourceString, Element> exportScope =
|
| + new LinkedHashMap<SourceString, Element>();
|
|
|
| /**
|
| * The set of exported elements that need to be propageted to dependent
|
| @@ -600,7 +601,7 @@ class LibraryDependencyHandler {
|
| * already been computed.
|
| */
|
| Map<LibraryElement,LibraryDependencyNode> nodeMap =
|
| - new Map<LibraryElement,LibraryDependencyNode>();
|
| + new LinkedHashMap<LibraryElement,LibraryDependencyNode>();
|
|
|
| LibraryDependencyHandler(Compiler this.compiler);
|
|
|
| @@ -613,8 +614,19 @@ class LibraryDependencyHandler {
|
| bool changed = true;
|
| while (changed) {
|
| changed = false;
|
| + Map<LibraryDependencyNode, List<Element>> tasks =
|
| + new LinkedHashMap<LibraryDependencyNode, List<Element>>();
|
| +
|
| + // Locally defined elements take precedence over exported
|
| + // elements. So we must propagate local elements first. We
|
| + // ensure this by pulling the pending exports before
|
| + // propagating. This enforces that we handle exports
|
| + // breadth-first, with locally defined elements being level 0.
|
| nodeMap.forEach((_, LibraryDependencyNode node) {
|
| - var pendingExports = node.pullPendingExports();
|
| + List<Element> pendingExports = node.pullPendingExports();
|
| + tasks[node] = pendingExports;
|
| + });
|
| + tasks.forEach((LibraryDependencyNode node, List<Element> pendingExports) {
|
| pendingExports.forEach((Element element) {
|
| element = node.addElementToExportScope(compiler, element);
|
| if (node.propagateElement(element)) {
|
|
|