Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(566)

Side by Side Diff: pkg/front_end/lib/src/fasta/uri_translator_impl.dart

Issue 2979003002: support resolving .packages in FE (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.uri_translator_impl; 5 library fasta.uri_translator_impl;
6 6
7 import 'dart:async' show Future; 7 import 'dart:async' show Future;
8 import 'dart:convert' show JSON; 8 import 'dart:convert' show JSON;
9 9
10 import 'package:front_end/file_system.dart' 10 import 'package:front_end/file_system.dart'
11 show FileSystem, FileSystemException; 11 show FileSystem, FileSystemException;
12 import 'package:front_end/src/fasta/uri_translator.dart'; 12 import 'package:front_end/src/fasta/uri_translator.dart';
13 import 'package:package_config/packages_file.dart' as packages_file show parse; 13 import 'package:package_config/packages_file.dart' as packages_file show parse;
14 import 'package:package_config/packages.dart' show Packages;
15 import 'package:package_config/src/packages_impl.dart' show MapPackages;
14 16
15 import 'deprecated_problems.dart' show deprecated_inputError; 17 import 'deprecated_problems.dart' show deprecated_inputError;
16 18
17 /// Read the JSON file with defined SDK libraries from the given [uri] in the 19 /// Read the JSON file with defined SDK libraries from the given [uri] in the
18 /// [fileSystem] and return the mapping from parsed Dart library names (e.g. 20 /// [fileSystem] and return the mapping from parsed Dart library names (e.g.
19 /// `math`) to file URIs. 21 /// `math`) to file URIs.
20 Future<Map<String, Uri>> computeDartLibraries( 22 Future<Map<String, Uri>> computeDartLibraries(
21 FileSystem fileSystem, Uri uri) async { 23 FileSystem fileSystem, Uri uri) async {
22 if (uri == null) return const <String, Uri>{}; 24 if (uri == null) return const <String, Uri>{};
23 Map<String, String> libraries = JSON 25 Map<String, String> libraries = JSON
(...skipping 15 matching lines...) Expand all
39 class UriTranslatorImpl implements UriTranslator { 41 class UriTranslatorImpl implements UriTranslator {
40 /// Mapping from Dart library names (e.g. `math`) to file URIs. 42 /// Mapping from Dart library names (e.g. `math`) to file URIs.
41 final Map<String, Uri> dartLibraries; 43 final Map<String, Uri> dartLibraries;
42 44
43 // TODO(ahe): We probably want this to be `Map<String, Uri>`, that is, just 45 // TODO(ahe): We probably want this to be `Map<String, Uri>`, that is, just
44 // one patch library (with parts). 46 // one patch library (with parts).
45 /// Mapping from Dart library names to the file URIs of patches to apply. 47 /// Mapping from Dart library names to the file URIs of patches to apply.
46 final Map<String, List<Uri>> dartPatches; 48 final Map<String, List<Uri>> dartPatches;
47 49
48 /// Mapping from package names (e.g. `angular`) to the file URIs. 50 /// Mapping from package names (e.g. `angular`) to the file URIs.
49 final Map<String, Uri> packages; 51 final Packages packages;
50 52
51 UriTranslatorImpl(this.dartLibraries, this.dartPatches, this.packages); 53 UriTranslatorImpl(this.dartLibraries, this.dartPatches, this.packages);
52 54
53 @override 55 @override
54 List<Uri> getDartPatches(String libraryName) => dartPatches[libraryName]; 56 List<Uri> getDartPatches(String libraryName) => dartPatches[libraryName];
55 57
56 @override 58 @override
57 bool isPlatformImplementation(Uri uri) { 59 bool isPlatformImplementation(Uri uri) {
58 if (uri.scheme != "dart") return false; 60 if (uri.scheme != "dart") return false;
59 String path = uri.path; 61 String path = uri.path;
(...skipping 19 matching lines...) Expand all
79 String libraryName = path.substring(0, index); 81 String libraryName = path.substring(0, index);
80 String relativePath = path.substring(index + 1); 82 String relativePath = path.substring(index + 1);
81 Uri libraryFileUri = dartLibraries[libraryName]; 83 Uri libraryFileUri = dartLibraries[libraryName];
82 return libraryFileUri?.resolve(relativePath); 84 return libraryFileUri?.resolve(relativePath);
83 } 85 }
84 86
85 /// Return the file URI that corresponds to the given `package` URI, or 87 /// Return the file URI that corresponds to the given `package` URI, or
86 /// `null` if the `package` [uri] format is invalid, or there is no 88 /// `null` if the `package` [uri] format is invalid, or there is no
87 /// corresponding package registered. 89 /// corresponding package registered.
88 Uri _translatePackageUri(Uri uri) { 90 Uri _translatePackageUri(Uri uri) {
89 int index = uri.path.indexOf("/"); 91 try {
90 if (index == -1) return null; 92 // TODO(sigmund): once we remove the `parse` API, we can ensure that
91 String name = uri.path.substring(0, index); 93 // packages will never be null and get rid of `?` below.
92 String path = uri.path.substring(index + 1); 94 return packages?.resolve(uri, notFound: (_) => null);
ahe 2017/07/14 13:44:57 Handle not found by reporting an error?
Siggi Cherem (dart-lang) 2017/07/14 19:54:06 Done. Note I was preserving the old semantics her
93 Uri root = packages[name]; 95 } on ArgumentError catch (_) {
ahe 2017/07/14 13:44:58 Argument error can occur for many reasons. Why is
Siggi Cherem (dart-lang) 2017/07/14 19:54:06 I hear you. As discussed offline, I filed a bug on
94 if (root == null) return null; 96 // TODO(sigmund): report an error.
Siggi Cherem (dart-lang) 2017/07/14 04:58:52 (I plan to do so once Peter lands his CL adding co
95 return root.resolve(path); 97 return null;
98 }
96 } 99 }
97 100
98 static Future<UriTranslator> parse(FileSystem fileSystem, Uri sdk, 101 static Future<UriTranslator> parse(FileSystem fileSystem, Uri sdk,
99 {Uri packages}) async { 102 {Uri packages}) async {
100 Uri librariesJson = sdk?.resolve("lib/libraries.json"); 103 Uri librariesJson = sdk?.resolve("lib/libraries.json");
101 104
102 // TODO(ahe): Provide a value for this file. 105 // TODO(ahe): Provide a value for this file.
103 Uri patches = null; 106 Uri patches = null;
104 107
105 packages ??= Uri.base.resolve(".packages"); 108 packages ??= Uri.base.resolve(".packages");
106 109
107 List<int> bytes; 110 List<int> bytes;
108 try { 111 try {
109 bytes = await fileSystem.entityForUri(packages).readAsBytes(); 112 bytes = await fileSystem.entityForUri(packages).readAsBytes();
110 } on FileSystemException catch (e) { 113 } on FileSystemException catch (e) {
111 deprecated_inputError(packages, -1, e.message); 114 deprecated_inputError(packages, -1, e.message);
112 } 115 }
113 116
114 Map<String, Uri> parsedPackages; 117 Packages parsedPackages;
115 try { 118 try {
116 parsedPackages = packages_file.parse(bytes, packages); 119 parsedPackages = new MapPackages(packages_file.parse(bytes, packages));
117 } on FormatException catch (e) { 120 } on FormatException catch (e) {
118 return deprecated_inputError(packages, e.offset, e.message); 121 return deprecated_inputError(packages, e.offset, e.message);
119 } 122 }
120 123
121 var dartLibraries = await computeDartLibraries(fileSystem, librariesJson); 124 var dartLibraries = await computeDartLibraries(fileSystem, librariesJson);
122 return new UriTranslatorImpl(dartLibraries, 125 return new UriTranslatorImpl(dartLibraries,
123 await computeDartPatches(fileSystem, patches), parsedPackages); 126 await computeDartPatches(fileSystem, patches), parsedPackages);
124 } 127 }
125 } 128 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698