| Index: lib/src/mirror_loader.dart
|
| diff --git a/lib/src/mirror_loader.dart b/lib/src/mirror_loader.dart
|
| index ba49566ccfbd69e97453466a2c0396be8ad0cf15..1caf144d2b731685acaa8796887c4ed3c3f69c30 100644
|
| --- a/lib/src/mirror_loader.dart
|
| +++ b/lib/src/mirror_loader.dart
|
| @@ -98,7 +98,7 @@ class InitializationCrawler {
|
| librariesSeen.add(lib);
|
|
|
| // First visit all our dependencies.
|
| - for (var dependency in _sortedLibraryDependencies(lib)) {
|
| + for (var dependency in lib.libraryDependencies) {
|
| // Skip dart: imports, they never use this package.
|
| if (dependency.targetLibrary.uri.toString().startsWith('dart:')) continue;
|
| if (librariesSeen.contains(dependency.targetLibrary)) continue;
|
| @@ -110,7 +110,7 @@ class InitializationCrawler {
|
| _readAnnotations(lib, queue);
|
|
|
| // Last, parse all class and method annotations.
|
| - for (var declaration in _sortedLibraryDeclarations(lib)) {
|
| + for (var declaration in _sortedDeclarationsWithMetadata(lib)) {
|
| _readAnnotations(declaration, queue);
|
| // Check classes for static annotations which are not supported
|
| if (declaration is ClassMirror) {
|
| @@ -123,34 +123,37 @@ class InitializationCrawler {
|
| return queue;
|
| }
|
|
|
| - Iterable<LibraryDependencyMirror> _sortedLibraryDependencies(
|
| - LibraryMirror lib) => new List.from(lib.libraryDependencies)
|
| - ..sort((a, b) {
|
| - var aScheme = a.targetLibrary.uri.scheme;
|
| - var bScheme = b.targetLibrary.uri.scheme;
|
| - if (aScheme != 'file' && bScheme == 'file') return -1;
|
| - if (bScheme != 'file' && aScheme == 'file') return 1;
|
| - return _relativeLibraryUri(a).compareTo(_relativeLibraryUri(b));
|
| - });
|
| -
|
| - String _relativeLibraryUri(LibraryDependencyMirror lib) {
|
| - if (lib.targetLibrary.uri.scheme == 'file' &&
|
| - lib.sourceLibrary.uri.scheme == 'file') {
|
| - return path.relative(lib.targetLibrary.uri.path,
|
| - from: path.dirname(lib.sourceLibrary.uri.path));
|
| - }
|
| - return lib.targetLibrary.uri.toString();
|
| + Iterable<DeclarationMirror> _sortedDeclarationsWithMetadata(
|
| + LibraryMirror lib) {
|
| + return new List()
|
| + ..addAll(_sortDeclarations(
|
| + lib, lib.declarations.values.where(
|
| + (d) => d is MethodMirror && d.metadata.isNotEmpty)))
|
| + ..addAll(_sortDeclarations(
|
| + lib, lib.declarations.values.where(
|
| + (d) => d is ClassMirror && d.metadata.isNotEmpty)));
|
| }
|
|
|
| - Iterable<DeclarationMirror> _sortedLibraryDeclarations(LibraryMirror lib) =>
|
| - lib.declarations.values
|
| - .where((d) => d is ClassMirror || d is MethodMirror)
|
| - .toList()
|
| - ..sort((a, b) {
|
| - if (a is MethodMirror && b is ClassMirror) return -1;
|
| - if (a is ClassMirror && b is MethodMirror) return 1;
|
| - return _declarationName(a).compareTo(_declarationName(b));
|
| + List<DeclarationMirror> _sortDeclarations(
|
| + LibraryMirror sourceLib, Iterable<DeclarationMirror> declarations) {
|
| + var declarationList = declarations.toList();
|
| + declarationList.sort((DeclarationMirror a, DeclarationMirror b) {
|
| + // If in the same file, compare by line.
|
| + var aSourceUri = a.location.sourceUri;
|
| + var bSourceUri = b.location.sourceUri;
|
| + if (aSourceUri == bSourceUri) {
|
| + return a.location.line.compareTo(b.location.line);
|
| + }
|
| +
|
| + // Run parts first if one is from the original library.
|
| + if (aSourceUri == sourceLib.uri) return 1;
|
| + if (bSourceUri == sourceLib.uri) return -1;
|
| +
|
| + // Sort parts alphabetically.
|
| + return aSourceUri.path.compareTo(bSourceUri.path);
|
| });
|
| + return declarationList;
|
| + }
|
|
|
| String _declarationName(DeclarationMirror declaration) =>
|
| MirrorSystem.getName(declaration.qualifiedName);
|
|
|