Index: lib/transformer.dart |
diff --git a/lib/transformer.dart b/lib/transformer.dart |
index 3d3a18c851f4e64fca1e419b8cb8c742eb11b549..8fec4b7bb024d6b379e52bc3b41972063c211eba 100644 |
--- a/lib/transformer.dart |
+++ b/lib/transformer.dart |
@@ -351,46 +351,53 @@ $initializersBuffer |
/// [lib]. This includes exported methods from other libraries too. |
List<FunctionElement> _topLevelMethodsOfLibrary( |
LibraryElement library, Set<LibraryElement> seen) { |
- var result = []; |
- result.addAll(library.units.expand((u) => u.functions)); |
- for (var export in library.exports) { |
+ var methods = []; |
+ |
+ var orderedExports = new List.from(library.exports) |
+ ..sort((a, b) => a.uriOffset.compareTo(b.uriOffset)); |
+ for (var export in orderedExports) { |
if (seen.contains(export.exportedLibrary)) continue; |
- var exported = _topLevelMethodsOfLibrary(export.exportedLibrary, seen); |
- _filter(exported, export.combinators); |
- result.addAll(exported); |
+ methods.addAll(_topLevelMethodsOfLibrary(export.exportedLibrary, seen)); |
+ } |
+ |
+ for (CompilationUnitElement unit in _orderedUnits(library)) { |
+ methods.addAll(new List.from(unit.functions) |
+ ..sort((a, b) => a.nameOffset.compareTo(b.nameOffset))); |
} |
- result.sort((a, b) => a.name.compareTo(b.name)); |
- return result; |
+ |
+ return methods; |
} |
/// Retrieves all classes that are visible if you were to import [lib]. This |
/// includes exported classes from other libraries. |
List<ClassElement> _classesOfLibrary( |
LibraryElement library, Set<LibraryElement> seen) { |
- var result = []; |
- result.addAll(library.units.expand((u) => u.types)); |
- for (var export in library.exports) { |
+ var classes = []; |
+ |
+ var orderedExports = new List.from(library.exports) |
+ ..sort((a, b) => a.uriOffset.compareTo(b.uriOffset)); |
+ for (var export in orderedExports) { |
if (seen.contains(export.exportedLibrary)) continue; |
- var exported = _classesOfLibrary(export.exportedLibrary, seen); |
- _filter(exported, export.combinators); |
- result.addAll(exported); |
+ classes.addAll(_classesOfLibrary(export.exportedLibrary, seen)); |
} |
- result.sort((a, b) => a.name.compareTo(b.name)); |
- return result; |
- } |
- /// Filters [elements] that come from an export, according to its show/hide |
- /// combinators. This modifies [elements] in place. |
- void _filter(List<Element> elements, List<NamespaceCombinator> combinators) { |
- for (var c in combinators) { |
- if (c is ShowElementCombinator) { |
- var show = c.shownNames.toSet(); |
- elements.retainWhere((e) => show.contains(e.displayName)); |
- } else if (c is HideElementCombinator) { |
- var hide = c.hiddenNames.toSet(); |
- elements.removeWhere((e) => hide.contains(e.displayName)); |
- } |
+ for (var unit in _orderedUnits(library)) { |
+ classes.addAll(new List.from(unit.types) |
+ ..sort((a, b) => a.nameOffset.compareTo(b.nameOffset))); |
} |
+ |
+ return classes; |
+ } |
+ |
+ List<CompilationUnitElement> _orderedUnits(LibraryElement library) { |
+ var definingUnit = library.definingCompilationUnit; |
+ // The first item is the source library, remove it for now. |
+ return new List.from(library.units) |
+ ..sort((a, b) { |
+ if (a == definingUnit) return 1; |
+ if (b == definingUnit) return -1; |
+ return a.uri.compareTo(b.uri); |
+ }); |
} |
Iterable<LibraryElement> _sortedLibraryDependencies(LibraryElement library) { |
@@ -402,32 +409,7 @@ $initializersBuffer |
return (new List.from(library.imports) |
..addAll(library.exports) |
- ..sort((a, b) { |
- // dart: imports don't have a uri |
- if (a.uri == null && b.uri != null) return -1; |
- if (b.uri == null && a.uri != null) return 1; |
- if (a.uri == null && b.uri == null) { |
- return getLibrary(a).name.compareTo(getLibrary(b).name); |
- } |
- |
- // package: imports next |
- var aIsPackage = a.uri.startsWith('package:'); |
- var bIsPackage = b.uri.startsWith('package:'); |
- if (aIsPackage && !bIsPackage) { |
- return -1; |
- } else if (bIsPackage && !aIsPackage) { |
- return 1; |
- } else if (bIsPackage && aIsPackage) { |
- return a.uri.compareTo(b.uri); |
- } |
- |
- // And finally compare based on the relative uri if both are file paths. |
- var aUri = path.url.relative(a.source.uri.path, |
- from: path.url.dirname(library.source.uri.path)); |
- var bUri = path.url.relative(b.source.uri.path, |
- from: path.url.dirname(library.source.uri.path)); |
- return aUri.compareTo(bUri); |
- })).map(getLibrary); |
+ ..sort((a, b) => a.nameOffset.compareTo(b.nameOffset))).map(getLibrary); |
} |
} |