| Index: sdk/lib/_internal/compiler/implementation/apiimpl.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
|
| index b15631a731f36759687f7d903c369a7699cb3e02..d211e9415c0895c2bf0ab1d6037ae8ef0fa19dbe 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
|
| @@ -133,12 +133,10 @@ class Compiler extends leg.Compiler {
|
| return "lib/$path";
|
| }
|
|
|
| - elements.LibraryElement scanBuiltinLibrary(String path) {
|
| + Future<elements.LibraryElement> scanBuiltinLibrary(String path) {
|
| Uri uri = libraryRoot.resolve(lookupLibraryPath(path));
|
| Uri canonicalUri = new Uri(scheme: "dart", path: path);
|
| - elements.LibraryElement library =
|
| - libraryLoader.loadLibrary(uri, null, canonicalUri);
|
| - return library;
|
| + return libraryLoader.loadLibrary(uri, null, canonicalUri);
|
| }
|
|
|
| void log(message) {
|
| @@ -157,30 +155,37 @@ class Compiler extends leg.Compiler {
|
| /**
|
| * Reads the script designated by [readableUri].
|
| */
|
| - leg.Script readScript(Uri readableUri, [tree.Node node]) {
|
| + Future<leg.Script> readScript(Uri readableUri,
|
| + [elements.Element element, tree.Node node]) {
|
| if (!readableUri.isAbsolute) {
|
| internalError('Relative uri $readableUri provided to readScript(Uri)',
|
| node: node);
|
| }
|
| - return fileReadingTask.measure(() {
|
| - Uri resourceUri = translateUri(readableUri, node);
|
| - String text = "";
|
| - try {
|
| - // TODO(ahe): We expect the future to be complete and call value
|
| - // directly. In effect, we don't support truly asynchronous API.
|
| - text = deprecatedFutureValue(provider(resourceUri));
|
| - } catch (exception) {
|
| +
|
| + // TODO(johnniwinther): Add [:report(..., {Element element}):] to
|
| + // report methods in Compiler.
|
| + void reportReadError(String exception) {
|
| + withCurrentElement(element, () {
|
| reportError(node,
|
| leg.MessageKind.READ_SCRIPT_ERROR,
|
| {'uri': readableUri, 'exception': exception});
|
| - return null;
|
| - }
|
| + });
|
| + }
|
| +
|
| + Uri resourceUri = translateUri(readableUri, node);
|
| + // TODO(johnniwinther): Wrap the result from [provider] in a specialized
|
| + // [Future] to ensure that we never execute an asynchronous action without setting
|
| + // up the current element of the compiler.
|
| + return new Future.sync(() => provider(resourceUri)).then((String text) {
|
| SourceFile sourceFile = new SourceFile(resourceUri.toString(), text);
|
| // We use [readableUri] as the URI for the script since need to preserve
|
| // the scheme in the script because [Script.uri] is used for resolving
|
| // relative URIs mentioned in the script. See the comment on
|
| // [LibraryLoader] for more details.
|
| return new leg.Script(readableUri, sourceFile);
|
| + }).catchError((error) {
|
| + reportReadError(error);
|
| + return null;
|
| });
|
| }
|
|
|
| @@ -254,18 +259,19 @@ class Compiler extends leg.Compiler {
|
| return packageRoot.resolve(uri.path);
|
| }
|
|
|
| - bool run(Uri uri) {
|
| + Future<bool> run(Uri uri) {
|
| log('Allowed library categories: $allowedLibraryCategories');
|
| - bool success = super.run(uri);
|
| - int cumulated = 0;
|
| - for (final task in tasks) {
|
| - cumulated += task.timing;
|
| - log('${task.name} took ${task.timing}msec');
|
| - }
|
| - int total = totalCompileTime.elapsedMilliseconds;
|
| - log('Total compile-time ${total}msec;'
|
| - ' unaccounted ${total - cumulated}msec');
|
| - return success;
|
| + return super.run(uri).then((bool success) {
|
| + int cumulated = 0;
|
| + for (final task in tasks) {
|
| + cumulated += task.timing;
|
| + log('${task.name} took ${task.timing}msec');
|
| + }
|
| + int total = totalCompileTime.elapsedMilliseconds;
|
| + log('Total compile-time ${total}msec;'
|
| + ' unaccounted ${total - cumulated}msec');
|
| + return success;
|
| + });
|
| }
|
|
|
| void reportDiagnostic(leg.SourceSpan span, String message,
|
|
|