| Index: pkg/front_end/lib/src/fasta/uri_translator_impl.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/uri_translator_impl.dart b/pkg/front_end/lib/src/fasta/uri_translator_impl.dart
|
| index df58a966875921a0cd048fa3a2e849f105f688d8..b34fe69d0dcb4ec96984ed04d7e1c9e8689bac1c 100644
|
| --- a/pkg/front_end/lib/src/fasta/uri_translator_impl.dart
|
| +++ b/pkg/front_end/lib/src/fasta/uri_translator_impl.dart
|
| @@ -9,8 +9,13 @@ import 'dart:convert' show JSON;
|
|
|
| import 'package:front_end/file_system.dart'
|
| show FileSystem, FileSystemException;
|
| +import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
|
| +import 'package:front_end/src/fasta/fasta_codes.dart';
|
| +import 'package:front_end/src/fasta/severity.dart' show Severity;
|
| import 'package:front_end/src/fasta/uri_translator.dart';
|
| import 'package:package_config/packages_file.dart' as packages_file show parse;
|
| +import 'package:package_config/packages.dart' show Packages;
|
| +import 'package:package_config/src/packages_impl.dart' show MapPackages;
|
|
|
| import 'deprecated_problems.dart' show deprecated_inputError;
|
|
|
| @@ -46,7 +51,7 @@ class UriTranslatorImpl implements UriTranslator {
|
| final Map<String, List<Uri>> dartPatches;
|
|
|
| /// Mapping from package names (e.g. `angular`) to the file URIs.
|
| - final Map<String, Uri> packages;
|
| + final Packages packages;
|
|
|
| UriTranslatorImpl(this.dartLibraries, this.dartPatches, this.packages);
|
|
|
| @@ -61,6 +66,9 @@ class UriTranslatorImpl implements UriTranslator {
|
| }
|
|
|
| @override
|
| + // TODO(sigmund, ahe): consider expanding this API to include an error
|
| + // callback, so we can provide an error location when one is available. For
|
| + // example, if the error occurs in an `import`.
|
| Uri translate(Uri uri) {
|
| if (uri.scheme == "dart") return _translateDartUri(uri);
|
| if (uri.scheme == "package") return _translatePackageUri(uri);
|
| @@ -86,13 +94,27 @@ class UriTranslatorImpl implements UriTranslator {
|
| /// `null` if the `package` [uri] format is invalid, or there is no
|
| /// corresponding package registered.
|
| Uri _translatePackageUri(Uri uri) {
|
| - int index = uri.path.indexOf("/");
|
| - if (index == -1) return null;
|
| - String name = uri.path.substring(0, index);
|
| - String path = uri.path.substring(index + 1);
|
| - Uri root = packages[name];
|
| - if (root == null) return null;
|
| - return root.resolve(path);
|
| + try {
|
| + // TODO(sigmund): once we remove the `parse` API, we can ensure that
|
| + // packages will never be null and get rid of `?` below.
|
| + return packages?.resolve(uri, notFound: _packageUriNotFound);
|
| + } on ArgumentError catch (e) {
|
| + // TODO(sigmund): catch a more precise error when
|
| + // https://github.com/dart-lang/package_config/issues/40 is fixed.
|
| + CompilerContext.current.reportWithoutLocation(
|
| + templateInvalidPackageUri.withArguments(uri, '$e'), Severity.error);
|
| + return null;
|
| + }
|
| + }
|
| +
|
| + static Uri _packageUriNotFound(Uri uri) {
|
| + String name = uri.pathSegments.first;
|
| + CompilerContext.current.reportWithoutLocation(
|
| + templatePackageNotFound.withArguments(name, uri), Severity.error);
|
| + // TODO(sigmund, ahe): ensure we only report an error once,
|
| + // this null result will likely cause another error further down in the
|
| + // compiler.
|
| + return null;
|
| }
|
|
|
| static Future<UriTranslator> parse(FileSystem fileSystem, Uri sdk,
|
| @@ -111,9 +133,9 @@ class UriTranslatorImpl implements UriTranslator {
|
| deprecated_inputError(packages, -1, e.message);
|
| }
|
|
|
| - Map<String, Uri> parsedPackages;
|
| + Packages parsedPackages;
|
| try {
|
| - parsedPackages = packages_file.parse(bytes, packages);
|
| + parsedPackages = new MapPackages(packages_file.parse(bytes, packages));
|
| } on FormatException catch (e) {
|
| return deprecated_inputError(packages, e.offset, e.message);
|
| }
|
|
|