Chromium Code Reviews

Unified Diff: sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart

Issue 203383014: Don't run transformers unnecessarily during the load process. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
« no previous file with comments | « no previous file | sdk/lib/_internal/pub/lib/src/utils.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)) {
« no previous file with comments | « no previous file | sdk/lib/_internal/pub/lib/src/utils.dart » ('j') | no next file with comments »

Powered by Google App Engine