Index: sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart |
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart |
index 5b6dfa78e772227544658993c1aff2f3df523293..3b668417ef5321553086efd41ce71ef461d7c1d3 100644 |
--- a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart |
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart |
@@ -29,36 +29,53 @@ void loadTransformers(SendPort replyTo) { |
/// Loads all the transformers and groups defined in [uri]. |
/// |
-/// Loads the library, finds any Transformer or TransformerGroup subclasses in |
-/// it, instantiates them with [configuration] and [mode], and returns them. |
-Iterable _initialize(Uri uri, Map configuration, BarbackMode mode) { |
+/// Loads the library, finds any [Transformer] or [TransformerGroup] subclasses |
+/// in it, instantiates them with [configuration] and [mode], and returns them. |
+List _initialize(Uri uri, Map configuration, BarbackMode mode) { |
var mirrors = currentMirrorSystem(); |
var transformerClass = reflectClass(Transformer); |
var groupClass = reflectClass(TransformerGroup); |
- // TODO(nweiz): if no valid transformers are found, throw an error message |
- // describing candidates and why they were rejected. |
- return mirrors.libraries[uri].declarations.values.map((declaration) { |
- if (declaration is! ClassMirror) return null; |
- var classMirror = declaration; |
- if (classMirror.isPrivate) return null; |
- if (classMirror.isAbstract) return null; |
- if (!classMirror.isSubtypeOf(transformerClass) && |
- !classMirror.isSubtypeOf(groupClass)) { |
- return null; |
- } |
+ var seen = new Set(); |
+ var transformers = []; |
+ |
+ loadFromLibrary(library) { |
+ if (seen.contains(library)) return; |
+ seen.add(library); |
- var constructor = _getConstructor(classMirror, 'asPlugin'); |
- if (constructor == null) return null; |
- if (constructor.parameters.isEmpty) { |
- if (configuration.isNotEmpty) return null; |
- return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee; |
+ // Load transformers from libraries exported by [library]. |
+ for (var dependency in library.libraryDependencies) { |
+ if (!dependency.isExport) continue; |
+ loadFromLibrary(dependency.targetLibrary); |
} |
- if (constructor.parameters.length != 1) return null; |
- return classMirror.newInstance(const Symbol('asPlugin'), |
- [new BarbackSettings(configuration, mode)]).reflectee; |
- }).where((classMirror) => classMirror != null); |
+ // TODO(nweiz): if no valid transformers are found, throw an error message |
+ // describing candidates and why they were rejected. |
+ transformers.addAll(library.declarations.values.map((declaration) { |
+ if (declaration is! ClassMirror) return null; |
+ var classMirror = declaration; |
+ if (classMirror.isPrivate) return null; |
+ if (classMirror.isAbstract) return null; |
+ if (!classMirror.isSubtypeOf(transformerClass) && |
+ !classMirror.isSubtypeOf(groupClass)) { |
+ return null; |
+ } |
+ |
+ var constructor = _getConstructor(classMirror, 'asPlugin'); |
+ if (constructor == null) return null; |
+ if (constructor.parameters.isEmpty) { |
+ if (configuration.isNotEmpty) return null; |
+ return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee; |
+ } |
+ if (constructor.parameters.length != 1) return null; |
+ |
+ return classMirror.newInstance(const Symbol('asPlugin'), |
+ [new BarbackSettings(configuration, mode)]).reflectee; |
+ }).where((classMirror) => classMirror != null)); |
+ } |
+ |
+ loadFromLibrary(mirrors.libraries[uri]); |
+ return transformers; |
} |
// TODO(nweiz): clean this up when issue 13248 is fixed. |