Chromium Code Reviews| 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 | 
| index 823833c3750842f99ab192584b60da45564a7711..a78f7b88afcb60aafa504927edaa1af19211da08 100644 | 
| --- a/sdk/lib/_internal/pub/lib/src/barback.dart | 
| +++ b/sdk/lib/_internal/pub/lib/src/barback.dart | 
| @@ -20,18 +20,48 @@ import 'utils.dart'; | 
| /// An identifier for a transformer and the configuration that will be passed to | 
| /// it. | 
| /// | 
| -/// It's possible that [asset] defines multiple transformers. If so, | 
| -/// [configuration] will be passed to all of them. | 
| +/// It's possible that the library identified by [this] defines multiple | 
| +/// transformers. If so, [configuration] will be passed to all of them. | 
| class TransformerId { | 
| - /// The asset containing the transformer. | 
| - final AssetId asset; | 
| + /// The package containing the library that this transformer identifies. | 
| 
 
Bob Nystrom
2013/10/28 17:24:25
"this transformer identifies" is confusing. How ab
 
nweiz
2013/10/28 23:58:06
Done.
 
 | 
| + final String package; | 
| + | 
| + /// The `/`-separated path identifying the library that contains this | 
| 
 
Bob Nystrom
2013/10/28 17:24:25
"identifying" -> "to"
 
nweiz
2013/10/28 23:58:06
Done.
 
 | 
| + /// transformer. | 
| + /// | 
| + /// This is relative to the `lib/` directory in [package], and doesn't end in | 
| + /// `.dart`. | 
| + /// | 
| + /// This can be null; if so, it indicates that the transformer(s) should be | 
| + /// loaded from `lib/transformer.dart` if that exists, and `lib/$package.dart` | 
| + /// otherwise. | 
| + final String path; | 
| /// The configuration to pass to the transformer. | 
| /// | 
| /// This will be null if no configuration was provided. | 
| final Map configuration; | 
| - TransformerId(this.asset, this.configuration) { | 
| + /// Parses a transformer identifier. | 
| + /// | 
| + /// A transformer identifier is a string of the form "package_name" or | 
| + /// "package_name/path/to/library". It does not have a trailing extension. If | 
| + /// it just has a package name, it expands to lib/transformer.dart if that | 
| + /// exists, or lib/${package}.dart otherwise. Otherwise, it expands to | 
| + /// lib/${path}.dart. In either case it's located in the given package. | 
| + factory TransformerId.parse(String identifier, Map configuration) { | 
| + if (identifier.isEmpty) { | 
| + throw new FormatException('Invalid library identifier: "".'); | 
| + } | 
| + | 
| + var parts = split1(identifier, "/"); | 
| + if (parts.length == 1) { | 
| + return new TransformerId(parts.single, null, configuration); | 
| + } | 
| + return new TransformerId(parts.first, parts.last, configuration); | 
| + } | 
| + | 
| + TransformerId(this.package, this.path, this.configuration) { | 
| if (configuration == null) return; | 
| for (var reserved in ['include', 'exclude']) { | 
| if (!configuration.containsKey(reserved)) continue; | 
| @@ -42,10 +72,27 @@ class TransformerId { | 
| // TODO(nweiz): support deep equality on [configuration] as well. | 
| bool operator==(other) => other is TransformerId && | 
| - other.asset == asset && | 
| + other.package == package && | 
| + other.path == path && | 
| other.configuration == configuration; | 
| - int get hashCode => asset.hashCode ^ configuration.hashCode; | 
| + int get hashCode => package.hashCode ^ path.hashCode ^ configuration.hashCode; | 
| + | 
| + String toString() => path == null ? package : '$package/$path'; | 
| + | 
| + /// Returns the asset id for the library identified by this transformer id. | 
| + /// | 
| + /// If `path` is null, this will determine which library to load. | 
| + Future<AssetId> getAssetId(Barback barback) { | 
| + if (path != null) { | 
| + return new Future.value(new AssetId(package, 'lib/$path.dart')); | 
| + } | 
| + | 
| + var transformerAsset = new AssetId(package, 'lib/transformer.dart'); | 
| + return barback.getAssetById(transformerAsset).then((_) => transformerAsset) | 
| + .catchError((e) => new AssetId(package, 'lib/$package.dart'), | 
| + test: (e) => e is AssetNotFoundException); | 
| + } | 
| } | 
| /// Creates a [BarbackServer] serving on [host] and [port]. | 
| @@ -97,47 +144,6 @@ Future<BarbackServer> createServer(String host, int port, PackageGraph graph, | 
| }); | 
| } | 
| -/// Parses a library identifier to an asset id. | 
| -/// | 
| -/// A library identifier is a string of the form "package_name" or | 
| -/// "package_name/path/to/library". It does not have a trailing extension. If it | 
| -/// just has a package name, it expands to lib/${package}.dart in that package. | 
| -/// Otherwise, it expands to lib/${path}.dart in that package. | 
| -AssetId libraryIdentifierToId(String identifier) { | 
| - if (identifier.isEmpty) { | 
| - throw new FormatException('Invalid library identifier: "".'); | 
| - } | 
| - | 
| - // Convert the concise asset name in the pubspec (of the form "package" | 
| - // or "package/library") to an AssetId that points to an actual dart | 
| - // file ("package/lib/package.dart" or "package/lib/library.dart", | 
| - // respectively). | 
| - var parts = split1(identifier, "/"); | 
| - if (parts.length == 1) parts.add(parts.single); | 
| - return new AssetId(parts.first, 'lib/' + parts.last + '.dart'); | 
| -} | 
| - | 
| -final _libraryPathRegExp = new RegExp(r"^lib/(.*)\.dart$"); | 
| - | 
| -/// Converts [id] to a library identifier. | 
| -/// | 
| -/// A library identifier is a string of the form "package_name" or | 
| -/// "package_name/path/to/library". It does not have a trailing extension. If it | 
| -/// just has a package name, it expands to lib/${package}.dart in that package. | 
| -/// Otherwise, it expands to lib/${path}.dart in that package. | 
| -/// | 
| -/// This will throw an [ArgumentError] if [id] doesn't represent a library in | 
| -/// `lib/`. | 
| -String idToLibraryIdentifier(AssetId id) { | 
| - var match = _libraryPathRegExp.firstMatch(id.path); | 
| - if (match == null) { | 
| - throw new ArgumentError("Asset id $id doesn't identify a library."); | 
| - } | 
| - | 
| - if (match[1] == id.package) return id.package; | 
| - return '${id.package}/${match[1]}'; | 
| -} | 
| - | 
| /// Converts [id] to a "package:" URI. | 
| /// | 
| /// This will throw an [ArgumentError] if [id] doesn't represent a library in |