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 fcfb3d0712fa3748a3f9e38232f30c3a57d4e174..8cbeb34ca1400232530ce5454452ad29c221d6c3 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 |
@@ -66,6 +66,7 @@ Future loadAllTransformers(BuildEnvironment environment, |
environment.barback.updateTransformers(r'$pub', [[rewrite]]); |
var orderingDeps = _computeOrderingDeps(environment.graph); |
+ var reverseOrderingDeps = reverseGraph(orderingDeps); |
var packageTransformers = _computePackageTransformers(environment.graph); |
var loader = new _TransformerLoader(environment, transformerServer); |
@@ -91,13 +92,24 @@ Future loadAllTransformers(BuildEnvironment environment, |
// First, load each package upon which [package] has an ordering dependency. |
var future = Future.wait(orderingDeps[package].map(loadPackage)).then((_) { |
// Go through the transformers used by [package] phase-by-phase. If any |
- // phase uses a transformer defined in [package] itself, that transform |
+ // phase uses a transformer defined in [package] itself, that transformer |
// should be loaded after running all previous phases. |
var transformers = [[rewrite]]; |
- return Future.forEach( |
- environment.graph.packages[package].pubspec.transformers, (phase) { |
+ |
+ 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((_) { |
+ // 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. |
+ var loadedAllTransformers = packageTransformers[package] |
+ .difference(loader.loadedTransformers).isEmpty; |
+ if (loadedAllTransformers && |
+ !reverseOrderingDeps.containsKey(package)) { |
+ return null; |
+ } |
+ |
transformers.add(unionAll(phase.map( |
(id) => loader.transformersFor(id)))); |
environment.barback.updateTransformers(package, transformers); |
@@ -231,6 +243,10 @@ class _TransformerLoader { |
/// Used for error reporting. |
final _transformerUsers = new Map<Pair<String, String>, Set<String>>(); |
+ // TODO(nweiz): Make this a view when issue 17637 is fixed. |
+ /// The set of all transformers that have been loaded so far. |
+ Set<TransformerId> get loadedTransformers => _transformers.keys.toSet(); |
+ |
_TransformerLoader(this._environment, this._transformerServer) { |
for (var package in _environment.graph.packages.values) { |
for (var id in unionAll(package.pubspec.transformers)) { |