Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

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

Issue 23625002: Support loading transformer plugins from pub. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/pub/lib/src/barback.dart
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
new file mode 100644
index 0000000000000000000000000000000000000000..36de8dc664bb995f2ed200a8014b59ab597085e8
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'barback/load_transformers.dart';
+import 'barback/pub_package_provider.dart';
+import 'barback/rewrite_import_transformer.dart';
+import 'barback/server.dart';
+import 'barback/watch_sources.dart';
+import 'utils.dart';
+
+/// Creates a [BarbackServer] serving on [host] and [port].
+///
+/// This transforms and serves all library and asset files in all packages in
+/// [graph]. It loads any transformer plugins defined in packages in [graph] and
+/// re-runs them as necessary when any input files change.
+Future<BarbackServer> createServer(String host, int port, PackageGraph graph) {
+ var provider = new PubPackageProvider(graph);
+ var barback = new Barback(provider);
+ return BarbackServer.bind(host, port, barback, graph.entrypoint.root.name)
+ .then((server) {
+ watchSources(graph, barback);
+
+ var completer = new Completer();
+
+ // If any errors get emitted either by barback or by the server, including
+ // non-programmatic barback errors, they should take down the whole program.
+ var subscriptions = [
+ server.barback.errors.listen((error) {
+ if (error is TransformerException) error = error.error;
+ if (!completer.isCompleted) completer.completeError(error);
+ }),
+ server.barback.results.listen((_) {}, onError: (error) {
+ if (!completer.isCompleted) completer.completeError(error);
+ }),
+ server.results.listen((_) {}, onError: (error) {
+ if (!completer.isCompleted) completer.completeError(error);
+ })
+ ];
+
+ _loadTransformers(server, graph).then((_) {
+ if (!completer.isCompleted) completer.complete(server);
+ }).catchError((error) {
+ if (!completer.isCompleted) completer.completeError(error);
+ });
+
+ return completer.future.whenComplete(() {
+ for (var subscription in subscriptions) {
+ subscription.cancel();
+ }
+ });
+ });
+}
+
+/// Loads all transformers depended on by packages in [graph].
+///
+/// This uses [server] to serve the Dart files from which transformers are
+/// loaded, then adds the transformers to `server.barback`.
+Future _loadTransformers(BarbackServer server, PackageGraph graph) {
+ // Add a rewrite transformer for each package, so that we can resolve
+ // "package:" imports while loading transformers.
+ var rewrite = new RewriteImportTransformer();
+ for (var package in graph.packages.values) {
+ server.barback.updateTransformers(package.name, [[rewrite]]);
+ }
+
+ // A map from each transformer id to the set of packages that use it.
+ var idsToPackages = new Map<AssetId, Set<String>>();
+ for (var package in graph.packages.values) {
+ for (var id in unionAll(package.pubspec.transformers)) {
+ idsToPackages.putIfAbsent(id, () => new Set<String>()).add(package.name);
+ }
+ }
+
+ // TODO(nweiz): support transformers that (possibly transitively)
+ // depend on other transformers.
+ var transformersForId = new Map<AssetId, Set<Transformer>>();
+ return Future.wait(idsToPackages.keys.map((id) {
+ return loadTransformers(server, id).then((transformers) {
+ if (transformers.isEmpty) {
+ var path = id.path.replaceFirst('lib/', '');
+ // Ensure that packages are listed in a deterministic order.
+ var packages = idsToPackages[id].toList();
+ packages.sort();
+ throw new ApplicationException(
+ "No transformers were defined in package:${id.package}/$path,\n"
+ "required by ${packages.join(', ')}.");
+ }
+
+ transformersForId[id] = transformers;
+ });
+ })).then((_) {
+ for (var package in graph.packages.values) {
+ var phases = package.pubspec.transformers.map((phase) {
+ return unionAll(phase.map((id) => transformersForId[id]));
+ });
+ server.barback.updateTransformers(package.name, phases);
+ }
+ });
+}

Powered by Google App Engine
This is Rietveld 408576698