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

Unified Diff: dart/lib/compiler/implementation/library_loader.dart

Issue 11270034: Fix a bug which caused exported elements to conflict with locally defined ones. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 2 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
« no previous file with comments | « no previous file | dart/tests/language/local_export_a.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)) {
« no previous file with comments | « no previous file | dart/tests/language/local_export_a.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698