Index: sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart |
index 64845d4de129ed604d00d6f329d28153cb9d71f0..6393aec51bd0d5295d670e8a61aa2779aa84ebb1 100644 |
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart |
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart |
@@ -98,8 +98,8 @@ Future loadAllTransformers(AssetEnvironment environment, |
var phases = environment.graph.packages[package].pubspec.transformers; |
return Future.forEach(phases, (phase) { |
- return Future.wait(phase.where((id) => id.package == package) |
- .map(loader.load)).then((_) { |
+ return loader.load(phase.where((id) => id.package == package)) |
+ .then((_) { |
// If we've already loaded all the transformers in this package and no |
// other package imports it, there's no need to keep applying |
// transformers, so we can short-circuit. |
@@ -118,7 +118,7 @@ Future loadAllTransformers(AssetEnvironment environment, |
// Now that we've applied all the transformers used by [package] via |
// [Barback.updateTransformers], we load any transformers defined in |
// [package] but used elsewhere. |
- return Future.wait(packageTransformers[package].map(loader.load)); |
+ return loader.load(packageTransformers[package]); |
}); |
}); |
loadingPackages[package] = future; |
@@ -257,41 +257,47 @@ class _TransformerLoader { |
} |
} |
- /// Loads the transformer(s) defined in [id]. |
+ /// Loads the transformer(s) defined in [ids]. |
/// |
/// Once the returned future completes, these transformers can be retrieved |
- /// using [transformersFor]. If [id] doesn't define any transformers, this |
+ /// using [transformersFor]. If any id doesn't define any transformers, this |
/// will complete to an error. |
- Future load(TransformerId id) { |
- if (_transformers.containsKey(id)) return new Future.value(); |
+ /// |
+ /// This will skip and ids that have already been loaded. |
+ Future load(Iterable<TransformerId> ids) { |
+ ids = ids.where((id) => !_transformers.containsKey(id)).toList(); |
+ if (ids.isEmpty) return new Future.value(); |
// TODO(nweiz): load multiple instances of the same transformer from the |
// same isolate rather than spinning up a separate isolate for each one. |
- return log.progress("Loading $id transformers", |
- () => loadTransformers(_environment, _transformerServer, id)) |
- .then((transformers) { |
- if (!transformers.isEmpty) { |
- _transformers[id] = transformers; |
- return; |
- } |
- |
- var message = "No transformers"; |
- if (id.configuration.isNotEmpty) { |
- message += " that accept configuration"; |
+ return log.progress("Loading ${toSentence(ids)} transformers", |
+ () => loadTransformers(_environment, _transformerServer, ids)) |
+ .then((allTransformers) { |
+ for (var id in ids) { |
+ var transformers = allTransformers[id]; |
+ if (transformers != null && transformers.isNotEmpty) { |
+ _transformers[id] = transformers; |
+ continue; |
+ } |
+ |
+ var message = "No transformers"; |
+ if (id.configuration.isNotEmpty) { |
+ message += " that accept configuration"; |
+ } |
+ |
+ var location; |
+ if (id.path == null) { |
+ location = 'package:${id.package}/transformer.dart or ' |
+ 'package:${id.package}/${id.package}.dart'; |
+ } else { |
+ location = 'package:$id.dart'; |
+ } |
+ var pair = new Pair(id.package, id.path); |
+ |
+ throw new ApplicationException( |
+ "$message were defined in $location,\n" |
+ "required by ${ordered(_transformerUsers[pair]).join(', ')}."); |
} |
- |
- var location; |
- if (id.path == null) { |
- location = 'package:${id.package}/transformer.dart or ' |
- 'package:${id.package}/${id.package}.dart'; |
- } else { |
- location = 'package:$id.dart'; |
- } |
- var pair = new Pair(id.package, id.path); |
- |
- throw new ApplicationException( |
- "$message were defined in $location,\n" |
- "required by ${ordered(_transformerUsers[pair]).join(', ')}."); |
}); |
} |