Index: sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart |
similarity index 63% |
copy from sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart |
copy to sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart |
index 035dbe6dda4f89d488db192e5b4c2b2d04ba3c88..8316d4e4e03c93f3c52c574755708e3c5216ae8d 100644 |
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart |
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart |
@@ -64,34 +64,55 @@ class AssetEnvironment { |
/// transformers, and server are loaded and ready. |
static Future<AssetEnvironment> create(Entrypoint entrypoint, |
BarbackMode mode, {WatcherType watcherType, String hostname, int basePort, |
- Iterable<String> packages, Iterable<AssetId> entrypoints, |
- bool useDart2JS: true}) { |
+ Iterable<String> packages, Iterable<AssetId> entrypoints, bool useDart2JS: |
+ true}) { |
if (watcherType == null) watcherType = WatcherType.NONE; |
if (hostname == null) hostname = "localhost"; |
if (basePort == null) basePort = 0; |
- return log.progress("Loading asset environment", () async { |
- var graph = await entrypoint.loadPackageGraph(); |
- graph = _adjustPackageGraph(graph, mode, packages); |
- var barback = new Barback(new PubPackageProvider(graph)); |
- barback.log.listen(_log); |
- |
- var environment = new AssetEnvironment._(graph, barback, mode, |
- watcherType, hostname, basePort); |
- |
- await environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS); |
- return environment; |
+ return log.progress("Loading asset environment", () { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ new Future.value(entrypoint.loadPackageGraph()).then((x0) { |
+ try { |
+ var graph = x0; |
+ graph = _adjustPackageGraph(graph, mode, packages); |
+ var barback = new Barback(new PubPackageProvider(graph)); |
+ barback.log.listen(_log); |
+ var environment = |
+ new AssetEnvironment._(graph, barback, mode, watcherType, hostname, basePort); |
+ new Future.value( |
+ environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS)).then((x1) { |
+ try { |
+ x1; |
+ completer0.complete(environment); |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e1, s1) { |
+ completer0.completeError(e1, s1); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
}, fine: true); |
} |
/// Return a version of [graph] that's restricted to [packages] (if passed) |
/// and loads cached packages (if [mode] is [BarbackMode.DEBUG]). |
- static PackageGraph _adjustPackageGraph(PackageGraph graph, |
- BarbackMode mode, Iterable<String> packages) { |
+ static PackageGraph _adjustPackageGraph(PackageGraph graph, BarbackMode mode, |
+ Iterable<String> packages) { |
if (mode != BarbackMode.DEBUG && packages == null) return graph; |
packages = (packages == null ? graph.packages.keys : packages).toSet(); |
- return new PackageGraph(graph.entrypoint, graph.lockFile, |
+ return new PackageGraph( |
+ graph.entrypoint, |
+ graph.lockFile, |
new Map.fromIterable(packages, value: (packageName) { |
var package = graph.packages[packageName]; |
if (mode != BarbackMode.DEBUG) return package; |
@@ -157,8 +178,8 @@ class AssetEnvironment { |
/// go to barback immediately. |
Set<AssetId> _modifiedSources; |
- AssetEnvironment._(this.graph, this.barback, this.mode, |
- this._watcherType, this._hostname, this._basePort); |
+ AssetEnvironment._(this.graph, this.barback, this.mode, this._watcherType, |
+ this._hostname, this._basePort); |
/// Gets the built-in [Transformer]s that should be added to [package]. |
/// |
@@ -185,8 +206,8 @@ class AssetEnvironment { |
// it's ephemeral in which case the admin port is too. |
if (port == null) port = _basePort == 0 ? 0 : _basePort - 1; |
- return AdminServer.bind(this, _hostname, port) |
- .then((server) => _adminServer = server); |
+ return AdminServer.bind(this, _hostname, port).then((server) => _adminServer = |
+ server); |
} |
/// Binds a new port to serve assets from within [rootDirectory] in the |
@@ -207,9 +228,10 @@ class AssetEnvironment { |
} |
// See if the new directory overlaps any existing servers. |
- var overlapping = _directories.keys.where((directory) => |
- path.isWithin(directory, rootDirectory) || |
- path.isWithin(rootDirectory, directory)).toList(); |
+ var overlapping = _directories.keys.where( |
+ (directory) => |
+ path.isWithin(directory, rootDirectory) || |
+ path.isWithin(rootDirectory, directory)).toList(); |
if (overlapping.isNotEmpty) { |
return new Future.error( |
@@ -220,19 +242,20 @@ class AssetEnvironment { |
// If not using an ephemeral port, find the lowest-numbered available one. |
if (port != 0) { |
- var boundPorts = _directories.values.map((directory) => directory.port) |
- .toSet(); |
+ var boundPorts = |
+ _directories.values.map((directory) => directory.port).toSet(); |
while (boundPorts.contains(port)) { |
port++; |
} |
} |
- var sourceDirectory = new SourceDirectory( |
- this, rootDirectory, _hostname, port); |
+ var sourceDirectory = |
+ new SourceDirectory(this, rootDirectory, _hostname, port); |
_directories[rootDirectory] = sourceDirectory; |
- return _provideDirectorySources(rootPackage, rootDirectory) |
- .then((subscription) { |
+ return _provideDirectorySources( |
+ rootPackage, |
+ rootDirectory).then((subscription) { |
sourceDirectory.watchSubscription = subscription; |
return sourceDirectory.serve(); |
}); |
@@ -247,9 +270,11 @@ class AssetEnvironment { |
/// |
/// Returns a [Future] that completes to the bound server. |
Future<BarbackServer> servePackageBinDirectory(String package) { |
- return _provideDirectorySources(graph.packages[package], "bin").then( |
- (_) => BarbackServer.bind(this, _hostname, 0, package: package, |
- rootDirectory: "bin")); |
+ return _provideDirectorySources( |
+ graph.packages[package], |
+ "bin").then( |
+ (_) => |
+ BarbackServer.bind(this, _hostname, 0, package: package, rootDirectory: "bin")); |
} |
/// Precompiles all of [packageName]'s executables to snapshots in |
@@ -260,41 +285,104 @@ class AssetEnvironment { |
/// Returns a map from executable name to path for the snapshots that were |
/// successfully precompiled. |
Future<Map<String, String>> precompileExecutables(String packageName, |
- String directory, {Iterable<AssetId> executableIds}) async { |
- if (executableIds == null) { |
- executableIds = graph.packages[packageName].executableIds; |
- } |
- |
- log.fine("Executables for $packageName: $executableIds"); |
- if (executableIds.isEmpty) return []; |
- |
- var package = graph.packages[packageName]; |
- var server = await servePackageBinDirectory(packageName); |
- try { |
- var precompiled = {}; |
- await waitAndPrintErrors(executableIds.map((id) async { |
- var basename = path.url.basename(id.path); |
- var snapshotPath = path.join(directory, "$basename.snapshot"); |
- var result = await runProcess(Platform.executable, [ |
- '--snapshot=$snapshotPath', |
- server.url.resolve(basename).toString() |
- ]); |
- if (result.success) { |
- log.message("Precompiled ${_formatExecutable(id)}."); |
- precompiled[path.withoutExtension(basename)] = snapshotPath; |
+ String directory, {Iterable<AssetId> executableIds}) { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ join0() { |
+ log.fine("Executables for ${packageName}: ${executableIds}"); |
+ join1() { |
+ var package = graph.packages[packageName]; |
+ new Future.value(servePackageBinDirectory(packageName)).then((x0) { |
+ try { |
+ var server = x0; |
+ join2() { |
+ completer0.complete(); |
+ } |
+ finally0(cont0) { |
+ server.close(); |
+ cont0(); |
+ } |
+ catch0(e1, s1) { |
+ finally0(() => completer0.completeError(e1, s1)); |
+ } |
+ try { |
+ var precompiled = {}; |
+ new Future.value(waitAndPrintErrors(executableIds.map(((id) { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ var basename = path.url.basename(id.path); |
+ var snapshotPath = |
+ path.join(directory, "${basename}.snapshot"); |
+ new Future.value( |
+ runProcess( |
+ Platform.executable, |
+ [ |
+ '--snapshot=${snapshotPath}', |
+ server.url.resolve(basename).toString()])).then((x0) { |
+ try { |
+ var result = x0; |
+ join0() { |
+ completer0.complete(); |
+ } |
+ if (result.success) { |
+ log.message( |
+ "Precompiled ${_formatExecutable(id)}."); |
+ precompiled[path.withoutExtension(basename)] = |
+ snapshotPath; |
+ join0(); |
+ } else { |
+ throw new ApplicationException( |
+ log.yellow("Failed to precompile ${_formatExecutable(id)}:\n") + |
+ result.stderr.join('\n')); |
+ join0(); |
+ } |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
+ })))).then((x1) { |
+ try { |
+ x1; |
+ final v0 = precompiled; |
+ finally0(() { |
+ completer0.complete(v0); |
+ }); |
+ } catch (e2, s2) { |
+ catch0(e2, s2); |
+ } |
+ }, onError: catch0); |
+ } catch (e3, s3) { |
+ catch0(e3, s3); |
+ } |
+ } catch (e4, s4) { |
+ completer0.completeError(e4, s4); |
+ } |
+ }, onError: completer0.completeError); |
+ } |
+ if (executableIds.isEmpty) { |
+ completer0.complete([]); |
+ } else { |
+ join1(); |
+ } |
+ } |
+ if (executableIds == null) { |
+ executableIds = graph.packages[packageName].executableIds; |
+ join0(); |
} else { |
- throw new ApplicationException( |
- log.yellow("Failed to precompile ${_formatExecutable(id)}:\n") + |
- result.stderr.join('\n')); |
+ join0(); |
} |
- })); |
- |
- return precompiled; |
- } finally { |
- // Don't await this future, since we have no need to wait for the server |
- // to fully shut down. |
- server.close(); |
- } |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
} |
/// Returns the executable name for [id]. |
@@ -329,9 +417,8 @@ class AssetEnvironment { |
/// If [assetPath] is not contained within a source directory, this throws |
/// an exception. |
String getSourceDirectoryContaining(String assetPath) => |
- _directories.values |
- .firstWhere((dir) => path.isWithin(dir.directory, assetPath)) |
- .directory; |
+ _directories.values.firstWhere( |
+ (dir) => path.isWithin(dir.directory, assetPath)).directory; |
/// Return all URLs serving [assetPath] in this environment. |
Future<List<Uri>> getUrlsForAssetPath(String assetPath) { |
@@ -350,12 +437,12 @@ class AssetEnvironment { |
Future<List<Uri>> _lookUpPathInServerRoot(String assetPath) { |
// Find all of the servers whose root directories contain the asset and |
// generate appropriate URLs for each. |
- return Future.wait(_directories.values |
- .where((dir) => path.isWithin(dir.directory, assetPath)) |
- .map((dir) { |
+ return Future.wait( |
+ _directories.values.where( |
+ (dir) => path.isWithin(dir.directory, assetPath)).map((dir) { |
var relativePath = path.relative(assetPath, from: dir.directory); |
- return dir.server.then((server) => |
- server.url.resolveUri(path.toUri(relativePath))); |
+ return dir.server.then( |
+ (server) => server.url.resolveUri(path.toUri(relativePath))); |
})); |
} |
@@ -365,8 +452,8 @@ class AssetEnvironment { |
if (components.first != "packages") return new Future.value([]); |
if (!graph.packages.containsKey(components[1])) return new Future.value([]); |
return Future.wait(_directories.values.map((dir) { |
- return dir.server.then((server) => |
- server.url.resolveUri(path.toUri(assetPath))); |
+ return dir.server.then( |
+ (server) => server.url.resolveUri(path.toUri(assetPath))); |
})); |
} |
@@ -380,11 +467,11 @@ class AssetEnvironment { |
var uri; |
if (path.isWithin(libDir, assetPath)) { |
- uri = path.toUri(path.join('packages', package.name, |
- path.relative(assetPath, from: libDir))); |
+ uri = path.toUri( |
+ path.join('packages', package.name, path.relative(assetPath, from: libDir))); |
} else if (path.isWithin(assetDir, assetPath)) { |
- uri = path.toUri(path.join('assets', package.name, |
- path.relative(assetPath, from: assetDir))); |
+ uri = path.toUri( |
+ path.join('assets', package.name, path.relative(assetPath, from: assetDir))); |
} else { |
continue; |
} |
@@ -402,8 +489,8 @@ class AssetEnvironment { |
/// |
/// If no server can serve [url], completes to `null`. |
Future<AssetId> getAssetIdForUrl(Uri url) { |
- return Future.wait(_directories.values.map((dir) => dir.server)) |
- .then((servers) { |
+ return Future.wait( |
+ _directories.values.map((dir) => dir.server)).then((servers) { |
var server = servers.firstWhere((server) { |
if (server.port != url.port) return false; |
return isLoopback(server.address.host) == isLoopback(url.host) || |
@@ -456,86 +543,163 @@ class AssetEnvironment { |
/// Returns a [Future] that completes once all inputs and transformers are |
/// loaded. |
Future _load({Iterable<AssetId> entrypoints, bool useDart2JS}) { |
- return log.progress("Initializing barback", () async { |
- // If the entrypoint package manually configures the dart2js |
- // transformer, don't include it in the built-in transformer list. |
- // |
- // TODO(nweiz): if/when we support more built-in transformers, make |
- // this more general. |
- var containsDart2JS = graph.entrypoint.root.pubspec.transformers |
- .any((transformers) => |
- transformers.any((config) => config.id.package == '\$dart2js')); |
- |
- if (!containsDart2JS && useDart2JS) { |
- _builtInTransformers.addAll([ |
- new Dart2JSTransformer(this, mode), |
- new DartForwardingTransformer(mode) |
- ]); |
- } |
- |
- // Bind a server that we can use to load the transformers. |
- var transformerServer = await BarbackServer.bind(this, _hostname, 0); |
- |
- var errorStream = barback.errors.map((error) { |
- // Even most normally non-fatal barback errors should take down pub if |
- // they happen during the initial load process. |
- if (error is! AssetLoadException) throw error; |
- |
- log.error(log.red(error.message)); |
- log.fine(error.stackTrace.terse); |
- }); |
- |
- await _withStreamErrors(() { |
- return log.progress("Loading source assets", _provideSources); |
- }, [errorStream, barback.results]); |
- |
- log.fine("Provided sources."); |
- |
- errorStream = barback.errors.map((error) { |
- // Now that we're loading transformers, errors they log shouldn't be |
- // fatal, since we're starting to run them on real user assets which |
- // may have e.g. syntax errors. If an error would cause a transformer |
- // to fail to load, the load failure will cause us to exit. |
- if (error is! TransformerException) throw error; |
- |
- var message = error.error.toString(); |
- if (error.stackTrace != null) { |
- message += "\n" + error.stackTrace.terse.toString(); |
+ return log.progress("Initializing barback", () { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ var containsDart2JS = |
+ graph.entrypoint.root.pubspec.transformers.any(((transformers) { |
+ return transformers.any( |
+ (config) => config.id.package == '\$dart2js'); |
+ })); |
+ join0() { |
+ new Future.value(BarbackServer.bind(this, _hostname, 0)).then((x0) { |
+ try { |
+ var transformerServer = x0; |
+ var errorStream = barback.errors.map(((error) { |
+ if (error is! AssetLoadException) throw error; |
+ log.error(log.red(error.message)); |
+ log.fine(error.stackTrace.terse); |
+ })); |
+ new Future.value(_withStreamErrors((() { |
+ return log.progress("Loading source assets", _provideSources); |
+ }), [errorStream, barback.results])).then((x1) { |
+ try { |
+ x1; |
+ log.fine("Provided sources."); |
+ errorStream = barback.errors.map(((error) { |
+ if (error is! TransformerException) throw error; |
+ var message = error.error.toString(); |
+ if (error.stackTrace != null) { |
+ message += "\n" + error.stackTrace.terse.toString(); |
+ } |
+ _log( |
+ new LogEntry( |
+ error.transform, |
+ error.transform.primaryId, |
+ LogLevel.ERROR, |
+ message, |
+ null)); |
+ })); |
+ new Future.value(_withStreamErrors((() { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ completer0.complete( |
+ log.progress("Loading transformers", (() { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ new Future.value( |
+ loadAllTransformers( |
+ this, |
+ transformerServer, |
+ entrypoints: entrypoints)).then((x0) { |
+ try { |
+ x0; |
+ transformerServer.close(); |
+ completer0.complete(); |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
+ }), fine: true)); |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
+ }), |
+ [errorStream, barback.results, transformerServer.results])).then((x2) { |
+ try { |
+ x2; |
+ completer0.complete(); |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e1, s1) { |
+ completer0.completeError(e1, s1); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e2, s2) { |
+ completer0.completeError(e2, s2); |
+ } |
+ }, onError: completer0.completeError); |
+ } |
+ if (!containsDart2JS && useDart2JS) { |
+ _builtInTransformers.addAll( |
+ [new Dart2JSTransformer(this, mode), new DartForwardingTransformer(mode)]); |
+ join0(); |
+ } else { |
+ join0(); |
+ } |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
} |
- |
- _log(new LogEntry(error.transform, error.transform.primaryId, |
- LogLevel.ERROR, message, null)); |
}); |
- |
- await _withStreamErrors(() async { |
- return log.progress("Loading transformers", () async { |
- await loadAllTransformers(this, transformerServer, |
- entrypoints: entrypoints); |
- transformerServer.close(); |
- }, fine: true); |
- }, [errorStream, barback.results, transformerServer.results]); |
+ return completer0.future; |
}, fine: true); |
} |
/// Provides the public source assets in the environment to barback. |
/// |
/// If [watcherType] is not [WatcherType.NONE], enables watching on them. |
- Future _provideSources() async { |
- // Just include the "lib" directory from each package. We'll add the |
- // other build directories in the root package by calling |
- // [serveDirectory]. |
- await Future.wait(graph.packages.values.map((package) async { |
- if (graph.isPackageStatic(package.name)) return; |
- await _provideDirectorySources(package, "lib"); |
- })); |
+ Future _provideSources() { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ new Future.value(Future.wait(graph.packages.values.map(((package) { |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ join0() { |
+ new Future.value( |
+ _provideDirectorySources(package, "lib")).then((x0) { |
+ try { |
+ x0; |
+ completer0.complete(); |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } |
+ if (graph.isPackageStatic(package.name)) { |
+ completer0.complete(null); |
+ } else { |
+ join0(); |
+ } |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
+ })))).then((x0) { |
+ try { |
+ x0; |
+ completer0.complete(); |
+ } catch (e0, s0) { |
+ completer0.completeError(e0, s0); |
+ } |
+ }, onError: completer0.completeError); |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
} |
/// Provides all of the source assets within [dir] in [package] to barback. |
/// |
/// If [watcherType] is not [WatcherType.NONE], enables watching on them. |
/// Returns the subscription to the watcher, or `null` if none was created. |
- Future<StreamSubscription<WatchEvent>> _provideDirectorySources( |
- Package package, String dir) { |
+ Future<StreamSubscription<WatchEvent>> |
+ _provideDirectorySources(Package package, String dir) { |
log.fine("Providing sources for ${package.name}|$dir."); |
// TODO(rnystrom): Handle overlapping directories. If two served |
// directories overlap like so: |
@@ -603,8 +767,8 @@ class AssetEnvironment { |
/// Adds a file watcher for [dir] within [package], if the directory exists |
/// and the package needs watching. |
- Future<StreamSubscription<WatchEvent>> _watchDirectorySources( |
- Package package, String dir) { |
+ Future<StreamSubscription<WatchEvent>> _watchDirectorySources(Package package, |
+ String dir) { |
// If this package comes from a cached source, its contents won't change so |
// we don't need to monitor it. `packageId` will be null for the |
// application package, since that's not locked. |
@@ -665,8 +829,8 @@ class AssetEnvironment { |
/// running. |
Future _withStreamErrors(Future futureCallback(), List<Stream> streams) { |
var completer = new Completer.sync(); |
- var subscriptions = streams.map((stream) => |
- stream.listen((_) {}, onError: completer.completeError)).toList(); |
+ var subscriptions = streams.map( |
+ (stream) => stream.listen((_) {}, onError: completer.completeError)).toList(); |
new Future.sync(futureCallback).then((_) { |
if (!completer.isCompleted) completer.complete(); |
@@ -693,7 +857,7 @@ void _log(LogEntry entry) { |
messageMentionsAsset(id) => |
messageMentions(id.toString()) || |
- messageMentions(path.fromUri(entry.assetId.path)); |
+ messageMentions(path.fromUri(entry.assetId.path)); |
var prefixParts = []; |
@@ -773,8 +937,7 @@ abstract class WatcherType { |
class _AutoWatcherType implements WatcherType { |
const _AutoWatcherType(); |
- DirectoryWatcher create(String directory) => |
- new DirectoryWatcher(directory); |
+ DirectoryWatcher create(String directory) => new DirectoryWatcher(directory); |
String toString() => "auto"; |
} |
@@ -783,7 +946,7 @@ class _PollingWatcherType implements WatcherType { |
const _PollingWatcherType(); |
DirectoryWatcher create(String directory) => |
- new PollingDirectoryWatcher(directory); |
+ new PollingDirectoryWatcher(directory); |
String toString() => "polling"; |
} |