Index: pkg/front_end/lib/src/fasta/translate_uri.dart |
diff --git a/pkg/front_end/lib/src/fasta/translate_uri.dart b/pkg/front_end/lib/src/fasta/translate_uri.dart |
index f17d9af91bbfffe2991f88ba0ad450f6714a9cab..003ff80e5205ea114ec8764f41732e0fa45e0ccc 100644 |
--- a/pkg/front_end/lib/src/fasta/translate_uri.dart |
+++ b/pkg/front_end/lib/src/fasta/translate_uri.dart |
@@ -6,7 +6,11 @@ library fasta.translate_uri; |
import 'dart:async' show Future; |
-import 'package:front_end/file_system.dart'; |
+import 'dart:convert' show JSON; |
+ |
+import 'package:front_end/file_system.dart' |
+ show FileSystem, FileSystemException; |
+ |
import 'package:package_config/packages_file.dart' as packages_file show parse; |
import 'errors.dart' show inputError; |
@@ -14,8 +18,9 @@ import 'errors.dart' show inputError; |
class TranslateUri { |
final Map<String, Uri> packages; |
final Map<String, Uri> dartLibraries; |
+ final Map<String, List<Uri>> patches; |
Siggi Cherem (dart-lang)
2017/05/22 16:21:15
BTW - I pinged Siva on Friday to see if we can cha
ahe
2017/05/22 16:26:47
Agreed.
|
- TranslateUri(this.packages, this.dartLibraries); |
+ TranslateUri(this.packages, this.dartLibraries, this.patches); |
Uri translate(Uri uri) { |
if (uri.scheme == "dart") return translateDartUri(uri); |
@@ -23,18 +28,7 @@ class TranslateUri { |
return null; |
} |
- Uri translateDartUri(Uri uri) { |
- if (!uri.isScheme('dart')) return null; |
- String path = uri.path; |
- |
- int index = path.indexOf('/'); |
- if (index == -1) return dartLibraries[path]; |
- |
- String libraryName = path.substring(0, index); |
- String relativePath = path.substring(index + 1); |
- Uri libraryFileUri = dartLibraries[libraryName]; |
- return libraryFileUri?.resolve(relativePath); |
- } |
+ Uri translateDartUri(Uri uri) => dartLibraries[uri.path]; |
Siggi Cherem (dart-lang)
2017/05/22 16:21:15
Let's document the invariant that you told me abou
ahe
2017/05/22 16:26:47
I'll take a further look at this.
ahe
2017/05/24 16:09:46
Let's go with the analyzer's approach. Personally,
|
Uri translatePackageUri(Uri uri) { |
int index = uri.path.indexOf("/"); |
@@ -47,82 +41,65 @@ class TranslateUri { |
} |
static Future<TranslateUri> parse(FileSystem fileSystem, Uri sdk, |
- [Uri uri]) async { |
- // This list below is generated with [bin/generate_dart_libraries.dart] and |
- // additional entries for _builtin, _vmservice, profiler, and vmservice_io. |
- // |
- // TODO(ahe): This is only used with the option --compile-sdk, and |
- // currently doesn't work outside the SDK source tree. |
- Map<String, Uri> dartLibraries = <String, Uri>{}; |
- if (sdk != null) { |
- dartLibraries = <String, Uri>{ |
- "_async_await_error_codes": sdk.resolve( |
- "lib/_internal/js_runtime/lib/shared/async_await_error_codes.dart"), |
- "_blink": sdk.resolve("lib/_blink/dartium/_blink_dartium.dart"), |
- "_builtin": sdk.resolve("lib/_builtin/_builtin.dart"), |
- "_chrome": sdk.resolve("lib/_chrome/dart2js/chrome_dart2js.dart"), |
- "_foreign_helper": |
- sdk.resolve("lib/_internal/js_runtime/lib/foreign_helper.dart"), |
- "_interceptors": |
- sdk.resolve("lib/_internal/js_runtime/lib/interceptors.dart"), |
- "_internal": sdk.resolve("lib/internal/internal.dart"), |
- "_isolate_helper": |
- sdk.resolve("lib/_internal/js_runtime/lib/isolate_helper.dart"), |
- "_js_embedded_names": sdk |
- .resolve("lib/_internal/js_runtime/lib/shared/embedded_names.dart"), |
- "_js_helper": |
- sdk.resolve("lib/_internal/js_runtime/lib/js_helper.dart"), |
- "_js_mirrors": |
- sdk.resolve("lib/_internal/js_runtime/lib/js_mirrors.dart"), |
- "_js_names": sdk.resolve("lib/_internal/js_runtime/lib/js_names.dart"), |
- "_js_primitives": |
- sdk.resolve("lib/_internal/js_runtime/lib/js_primitives.dart"), |
- "_metadata": sdk.resolve("lib/html/html_common/metadata.dart"), |
- "_native_typed_data": |
- sdk.resolve("lib/_internal/js_runtime/lib/native_typed_data.dart"), |
- "_vmservice": sdk.resolve("lib/vmservice/vmservice.dart"), |
- "async": sdk.resolve("lib/async/async.dart"), |
- "collection": sdk.resolve("lib/collection/collection.dart"), |
- "convert": sdk.resolve("lib/convert/convert.dart"), |
- "core": sdk.resolve("lib/core/core.dart"), |
- "developer": sdk.resolve("lib/developer/developer.dart"), |
- "html": sdk.resolve("lib/html/dart2js/html_dart2js.dart"), |
- "html_common": |
- sdk.resolve("lib/html/html_common/html_common_dart2js.dart"), |
- "indexed_db": |
- sdk.resolve("lib/indexed_db/dart2js/indexed_db_dart2js.dart"), |
- "io": sdk.resolve("lib/io/io.dart"), |
- "isolate": sdk.resolve("lib/isolate/isolate.dart"), |
- "js": sdk.resolve("lib/js/dart2js/js_dart2js.dart"), |
- "js_util": sdk.resolve("lib/js_util/dart2js/js_util_dart2js.dart"), |
- "math": sdk.resolve("lib/math/math.dart"), |
- "mirrors": sdk.resolve("lib/mirrors/mirrors.dart"), |
- "nativewrappers": sdk.resolve("lib/html/dartium/nativewrappers.dart"), |
- "profiler": sdk.resolve("lib/profiler/profiler.dart"), |
- "svg": sdk.resolve("lib/svg/dart2js/svg_dart2js.dart"), |
- "typed_data": sdk.resolve("lib/typed_data/typed_data.dart"), |
- "vmservice_io": sdk.resolve("lib/vmservice_io/vmservice_io.dart"), |
- "web_audio": |
- sdk.resolve("lib/web_audio/dart2js/web_audio_dart2js.dart"), |
- "web_gl": sdk.resolve("lib/web_gl/dart2js/web_gl_dart2js.dart"), |
- "web_sql": sdk.resolve("lib/web_sql/dart2js/web_sql_dart2js.dart"), |
- }; |
- } |
- uri ??= Uri.base.resolve(".packages"); |
+ {Uri packages}) async { |
+ Uri librariesJson = sdk?.resolve("lib/libraries.json"); |
+ |
+ // TODO(ahe): Should be something like |
+ // `Uri.base.resolve("runtime/vm/libraries.json")`. |
Siggi Cherem (dart-lang)
2017/05/22 16:21:15
On the design doc, I was pushing for having a sing
ahe
2017/05/22 16:26:47
OK. That's great, in that case, I should delete ru
|
+ Uri patches = null; |
+ |
+ packages ??= Uri.base.resolve(".packages"); |
List<int> bytes; |
try { |
- bytes = await fileSystem.entityForUri(uri).readAsBytes(); |
+ bytes = await fileSystem.entityForUri(packages).readAsBytes(); |
} on FileSystemException catch (e) { |
- inputError(uri, -1, e.message); |
+ inputError(packages, -1, e.message); |
} |
- Map<String, Uri> packages = const <String, Uri>{}; |
+ Map<String, Uri> parsedPackages; |
try { |
- packages = packages_file.parse(bytes, uri); |
+ parsedPackages = packages_file.parse(bytes, packages); |
} on FormatException catch (e) { |
- return inputError(uri, e.offset, e.message); |
+ return inputError(packages, e.offset, e.message); |
} |
- return new TranslateUri(packages, dartLibraries); |
+ return new TranslateUri( |
+ parsedPackages, |
+ await computeLibraries(fileSystem, librariesJson), |
+ await computePatches(fileSystem, patches)); |
} |
} |
+ |
+Future<Map<String, Uri>> computeLibraries( |
+ FileSystem fileSystem, Uri uri) async { |
+ if (uri == null) return const <String, Uri>{}; |
+ Map<String, String> libraries = JSON |
+ .decode(await fileSystem.entityForUri(uri).readAsString())["libraries"]; |
+ Map<String, Uri> result = <String, Uri>{}; |
+ libraries.forEach((String name, String path) { |
+ result[name] = uri.resolve(path); |
+ }); |
+ return result; |
+} |
+ |
+Future<Map<String, List<Uri>>> computePatches( |
+ FileSystem fileSystem, Uri uri) async { |
+ if (uri == null) return const <String, List<Uri>>{}; |
+ Map<String, List<Uri>> result = <String, List<Uri>>{}; |
Siggi Cherem (dart-lang)
2017/05/22 16:21:15
until we add the support for patching and decide o
ahe
2017/05/22 16:26:47
Sure.
|
+ JSON |
+ .decode(await fileSystem.entityForUri(uri).readAsString()) |
+ .forEach((String name, data) { |
+ List<String> sources = data["sources"]; |
+ Uri directory = uri.resolve("${data['directory']}/"); |
+ List<Uri> resolvedSources = <Uri>[]; |
+ for (String source in sources) { |
+ if (source.endsWith(".dart")) { |
+ resolvedSources.add(directory.resolve(source)); |
+ } |
+ } |
+ if (resolvedSources.isNotEmpty) { |
+ result[name] = resolvedSources; |
+ } |
+ }); |
+ return result; |
+} |