Chromium Code Reviews| Index: lib/transformer.dart | 
| diff --git a/lib/transformer.dart b/lib/transformer.dart | 
| index 3d3a18c851f4e64fca1e419b8cb8c742eb11b549..56a5969da0bb7d0562826896a08c8084f3537446 100644 | 
| --- a/lib/transformer.dart | 
| +++ b/lib/transformer.dart | 
| @@ -351,46 +351,52 @@ $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) { | 
| + // The first item is the source library, remove it for now. | 
| 
 
Siggi Cherem (dart-lang)
2015/03/17 22:17:18
actually, you can use library.definingCompilationU
 
jakemac
2015/03/17 22:50:48
Done.
 
 | 
| + var orderedUnits = new List.from(library.units) | 
| + ..removeAt(0) | 
| + ..sort((a, b) => a.uri.compareTo(b.uri)); | 
| + | 
| + // Add back the main library as the last unit. | 
| + return orderedUnits..add(library.units.first);; | 
| } | 
| Iterable<LibraryElement> _sortedLibraryDependencies(LibraryElement library) { | 
| @@ -402,32 +408,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); | 
| } | 
| } |