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

Side by Side Diff: pkg/compiler/lib/src/apiimpl.dart

Issue 1408253006: Introduce "platform configurations" to replace categories and libraries.dart. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix create_sdk scripts according to review Created 5 years, 1 month 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
« no previous file with comments | « create_sdk.gyp ('k') | pkg/compiler/lib/src/common/backend_api.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 leg_apiimpl; 5 library leg_apiimpl;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 9
10 import 'package:package_config/packages.dart'; 10 import 'package:package_config/packages.dart';
11 import 'package:package_config/packages_file.dart' as pkgs; 11 import 'package:package_config/packages_file.dart' as pkgs;
12 import 'package:package_config/src/packages_impl.dart' show 12 import 'package:package_config/src/packages_impl.dart' show
13 MapPackages, 13 MapPackages,
14 NonFilePackagesDirectoryPackages; 14 NonFilePackagesDirectoryPackages;
15 import 'package:package_config/src/util.dart' show 15 import 'package:package_config/src/util.dart' show
16 checkValidPackageUri; 16 checkValidPackageUri;
17 import 'package:sdk_library_metadata/libraries.dart' as library_info;
18 17
19 import '../compiler_new.dart' as api; 18 import '../compiler_new.dart' as api;
20 import 'commandline_options.dart'; 19 import 'commandline_options.dart';
21 import 'common.dart'; 20 import 'common.dart';
22 import 'common/tasks.dart' show 21 import 'common/tasks.dart' show
23 GenericTask; 22 GenericTask;
24 import 'compiler.dart'; 23 import 'compiler.dart';
25 import 'diagnostics/diagnostic_listener.dart' show 24 import 'diagnostics/diagnostic_listener.dart' show
26 DiagnosticOptions; 25 DiagnosticOptions;
27 import 'diagnostics/messages.dart' show 26 import 'diagnostics/messages.dart' show
28 Message; 27 Message;
29 import 'elements/elements.dart' as elements; 28 import 'elements/elements.dart' as elements;
30 import 'io/source_file.dart'; 29 import 'io/source_file.dart';
30 import 'platform_configuration.dart' as platform_configuration;
31 import 'script.dart'; 31 import 'script.dart';
32 32
33 const bool forceIncrementalSupport = 33 const bool forceIncrementalSupport =
34 const bool.fromEnvironment('DART2JS_EXPERIMENTAL_INCREMENTAL_SUPPORT'); 34 const bool.fromEnvironment('DART2JS_EXPERIMENTAL_INCREMENTAL_SUPPORT');
35 35
36 /// Locations of the platform descriptor files relative to the library root.
37 const String _clientPlatform = "lib/dart_client.platform";
38 const String _serverPlatform = "lib/dart_server.platform";
39 const String _sharedPlatform = "lib/dart_shared.platform";
40 const String _dart2dartPlatform = "lib/dart2dart.platform";
41
36 /// Implements the [Compiler] using a [api.CompilerInput] for supplying the 42 /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
37 /// sources. 43 /// sources.
38 class CompilerImpl extends Compiler { 44 class CompilerImpl extends Compiler {
39 api.CompilerInput provider; 45 api.CompilerInput provider;
40 api.CompilerDiagnostics handler; 46 api.CompilerDiagnostics handler;
41 final Uri libraryRoot; 47 final Uri platformConfigUri;
42 final Uri packageConfig; 48 final Uri packageConfig;
43 final Uri packageRoot; 49 final Uri packageRoot;
44 final api.PackagesDiscoveryProvider packagesDiscoveryProvider; 50 final api.PackagesDiscoveryProvider packagesDiscoveryProvider;
45 Packages packages; 51 Packages packages;
46 List<String> options; 52 List<String> options;
47 Map<String, dynamic> environment; 53 Map<String, dynamic> environment;
48 bool mockableLibraryUsed = false; 54 bool mockableLibraryUsed = false;
49 final Set<library_info.Category> allowedLibraryCategories; 55
56 /// A mapping of the dart: library-names to their location.
57 ///
58 /// Initialized in [setupSdk].
59 Map<String, Uri> sdkLibraries;
50 60
51 GenericTask userHandlerTask; 61 GenericTask userHandlerTask;
52 GenericTask userProviderTask; 62 GenericTask userProviderTask;
53 GenericTask userPackagesDiscoveryTask; 63 GenericTask userPackagesDiscoveryTask;
54 64
65 Uri get libraryRoot => platformConfigUri.resolve(".");
66
55 CompilerImpl(this.provider, 67 CompilerImpl(this.provider,
56 api.CompilerOutput outputProvider, 68 api.CompilerOutput outputProvider,
57 this.handler, 69 this.handler,
58 this.libraryRoot, 70 Uri libraryRoot,
59 this.packageRoot, 71 this.packageRoot,
60 List<String> options, 72 List<String> options,
61 this.environment, 73 this.environment,
62 [this.packageConfig, 74 [this.packageConfig,
63 this.packagesDiscoveryProvider]) 75 this.packagesDiscoveryProvider])
64 : this.options = options, 76 : this.options = options,
65 this.allowedLibraryCategories = getAllowedLibraryCategories(options), 77 this.platformConfigUri = resolvePlatformConfig(libraryRoot, options),
66 super( 78 super(
67 outputProvider: outputProvider, 79 outputProvider: outputProvider,
68 enableTypeAssertions: hasOption(options, Flags.enableCheckedMode), 80 enableTypeAssertions: hasOption(options, Flags.enableCheckedMode),
69 enableUserAssertions: hasOption(options, Flags.enableCheckedMode), 81 enableUserAssertions: hasOption(options, Flags.enableCheckedMode),
70 trustTypeAnnotations: 82 trustTypeAnnotations:
71 hasOption(options, Flags.trustTypeAnnotations), 83 hasOption(options, Flags.trustTypeAnnotations),
72 trustPrimitives: 84 trustPrimitives:
73 hasOption(options, Flags.trustPrimitives), 85 hasOption(options, Flags.trustPrimitives),
74 enableMinification: hasOption(options, Flags.minify), 86 enableMinification: hasOption(options, Flags.minify),
75 useFrequencyNamer: 87 useFrequencyNamer:
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // CSV: Comma separated values. 180 // CSV: Comma separated values.
169 static List<String> extractCsvOption(List<String> options, String prefix) { 181 static List<String> extractCsvOption(List<String> options, String prefix) {
170 for (String option in options) { 182 for (String option in options) {
171 if (option.startsWith(prefix)) { 183 if (option.startsWith(prefix)) {
172 return option.substring(prefix.length).split(','); 184 return option.substring(prefix.length).split(',');
173 } 185 }
174 } 186 }
175 return const <String>[]; 187 return const <String>[];
176 } 188 }
177 189
178 static Set<library_info.Category> getAllowedLibraryCategories( 190 static Uri resolvePlatformConfig(Uri libraryRoot,
179 List<String> options) { 191 List<String> options) {
180 Iterable<library_info.Category> categories = 192 String platformConfigPath =
181 extractCsvOption(options, '--categories=') 193 extractStringOption(options, "--platform-config=", null);
182 .map(library_info.parseCategory) 194 if (platformConfigPath != null) {
183 .where((x) => x != null); 195 return libraryRoot.resolve(platformConfigPath);
184 if (categories.isEmpty) { 196 } else if (hasOption(options, '--output-type=dart')) {
185 return new Set.from([library_info.Category.client]); 197 return libraryRoot.resolve(_dart2dartPlatform);
198 } else {
199 Iterable<String> categories = extractCsvOption(options, '--categories=');
200 if (categories.length == 0) {
201 return libraryRoot.resolve(_clientPlatform);
202 }
203 assert(categories.length <= 2);
204 if (categories.contains("Client")) {
205 if (categories.contains("Server")) {
206 return libraryRoot.resolve(_sharedPlatform);
207 }
208 return libraryRoot.resolve(_clientPlatform);
209 }
210 assert(categories.contains("Server"));
211 return libraryRoot.resolve(_serverPlatform);
186 } 212 }
187 return new Set.from(categories);
188 } 213 }
189 214
190 static bool hasOption(List<String> options, String option) { 215 static bool hasOption(List<String> options, String option) {
191 return options.indexOf(option) >= 0; 216 return options.indexOf(option) >= 0;
192 } 217 }
193 218
194 String lookupPatchPath(String dartLibraryName) {
195 library_info.LibraryInfo info = lookupLibraryInfo(dartLibraryName);
196 if (info == null) return null;
197 if (!info.isDart2jsLibrary) return null;
198 String path = info.dart2jsPatchPath;
199 if (path == null) return null;
200 return "lib/$path";
201 }
202
203 void log(message) { 219 void log(message) {
204 callUserHandler( 220 callUserHandler(
205 null, null, null, null, message, api.Diagnostic.VERBOSE_INFO); 221 null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
206 } 222 }
207 223
208 /// See [Compiler.translateResolvedUri]. 224 /// See [Compiler.translateResolvedUri].
209 Uri translateResolvedUri(elements.LibraryElement importingLibrary, 225 Uri translateResolvedUri(elements.LibraryElement importingLibrary,
210 Uri resolvedUri, Spannable spannable) { 226 Uri resolvedUri, Spannable spannable) {
211 if (resolvedUri.scheme == 'dart') { 227 if (resolvedUri.scheme == 'dart') {
212 return translateDartUri(importingLibrary, resolvedUri, spannable); 228 return translateDartUri(importingLibrary, resolvedUri, spannable);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 * See [LibraryLoader] for terminology on URIs. 313 * See [LibraryLoader] for terminology on URIs.
298 */ 314 */
299 Uri translateUri(Spannable node, Uri readableUri) { 315 Uri translateUri(Spannable node, Uri readableUri) {
300 switch (readableUri.scheme) { 316 switch (readableUri.scheme) {
301 case 'package': return translatePackageUri(node, readableUri); 317 case 'package': return translatePackageUri(node, readableUri);
302 default: return readableUri; 318 default: return readableUri;
303 } 319 }
304 } 320 }
305 321
306 /// Translates "resolvedUri" with scheme "dart" to a [uri] resolved relative 322 /// Translates "resolvedUri" with scheme "dart" to a [uri] resolved relative
307 /// to [libraryRoot] according to the information in [library_info.libraries]. 323 /// to [platformConfigUri] according to the information in the file at
324 /// [platformConfigUri].
308 /// 325 ///
309 /// Returns null and emits an error if the library could not be found or 326 /// Returns null and emits an error if the library could not be found or
310 /// imported into [importingLibrary]. 327 /// imported into [importingLibrary].
311 /// 328 ///
312 /// If [importingLibrary] is a platform or patch library all dart2js libraries 329 /// Internal libraries (whose name starts with '_') can be only resolved if
313 /// can be resolved. Otherwise only libraries with categories in 330 /// [importingLibrary] is a platform or patch library.
314 /// [allowedLibraryCategories] can be resolved.
315 Uri translateDartUri(elements.LibraryElement importingLibrary, 331 Uri translateDartUri(elements.LibraryElement importingLibrary,
316 Uri resolvedUri, Spannable spannable) { 332 Uri resolvedUri, Spannable spannable) {
317 333
318 library_info.LibraryInfo libraryInfo = lookupLibraryInfo(resolvedUri.path); 334 Uri location = lookupLibraryUri(resolvedUri.path);
319 335
320 bool allowInternalLibraryAccess = false; 336 if (location == null) {
321 if (importingLibrary != null) { 337 reporter.reportErrorMessage(
322 if (importingLibrary.isPlatformLibrary || importingLibrary.isPatch) { 338 spannable,
323 allowInternalLibraryAccess = true; 339 MessageKind.LIBRARY_NOT_FOUND,
324 } else if (importingLibrary.canonicalUri.path.contains( 340 {'resolvedUri': resolvedUri});
325 'sdk/tests/compiler/dart2js_native')) { 341 return null;
326 allowInternalLibraryAccess = true; 342 }
343
344 if (resolvedUri.path.startsWith('_') ) {
345 bool allowInternalLibraryAccess = importingLibrary != null &&
346 (importingLibrary.isPlatformLibrary ||
347 importingLibrary.isPatch ||
348 importingLibrary.canonicalUri.path
349 .contains('sdk/tests/compiler/dart2js_native'));
350
351 if (!allowInternalLibraryAccess) {
352 if (importingLibrary != null) {
353 reporter.reportErrorMessage(
354 spannable,
355 MessageKind.INTERNAL_LIBRARY_FROM,
356 {'resolvedUri': resolvedUri,
357 'importingUri': importingLibrary.canonicalUri});
358 } else {
359 reporter.reportErrorMessage(
360 spannable,
361 MessageKind.INTERNAL_LIBRARY,
362 {'resolvedUri': resolvedUri});
363 registerDisallowedLibraryUse(resolvedUri);
364 }
365 return null;
327 } 366 }
328 } 367 }
329 368
330 String computePath() { 369 if (location.scheme == "unsupported") {
331 if (libraryInfo == null) { 370 reporter.reportErrorMessage(
332 return null; 371 spannable,
333 } else if (!libraryInfo.isDart2jsLibrary) { 372 MessageKind.LIBRARY_NOT_SUPPORTED,
334 return null; 373 {'resolvedUri': resolvedUri});
335 } else { 374 registerDisallowedLibraryUse(resolvedUri);
336 if (libraryInfo.isInternal &&
337 !allowInternalLibraryAccess) {
338 if (importingLibrary != null) {
339 reporter.reportErrorMessage(
340 spannable,
341 MessageKind.INTERNAL_LIBRARY_FROM,
342 {'resolvedUri': resolvedUri,
343 'importingUri': importingLibrary.canonicalUri});
344 } else {
345 reporter.reportErrorMessage(
346 spannable,
347 MessageKind.INTERNAL_LIBRARY,
348 {'resolvedUri': resolvedUri});
349 registerDisallowedLibraryUse(resolvedUri);
350 }
351 return null;
352 } else if (!allowInternalLibraryAccess &&
353 !allowedLibraryCategories.any(libraryInfo.categories.contains)) {
354 registerDisallowedLibraryUse(resolvedUri);
355 // TODO(sigurdm): Currently we allow the sdk libraries to import
356 // libraries from any category. We might want to revisit this.
357 return null;
358 } else {
359 return (libraryInfo.dart2jsPath != null)
360 ? libraryInfo.dart2jsPath
361 : libraryInfo.path;
362 }
363 }
364 }
365
366 String path = computePath();
367
368 if (path == null) {
369 if (libraryInfo == null) {
370 reporter.reportErrorMessage(
371 spannable,
372 MessageKind.LIBRARY_NOT_FOUND,
373 {'resolvedUri': resolvedUri});
374 } else {
375 reporter.reportErrorMessage(
376 spannable,
377 MessageKind.LIBRARY_NOT_SUPPORTED,
378 {'resolvedUri': resolvedUri});
379 }
380 // TODO(johnniwinther): Support signaling the error through the returned
381 // value.
382 return null; 375 return null;
383 } 376 }
384 377
385 if (resolvedUri.path == 'html' || 378 if (resolvedUri.path == 'html' ||
386 resolvedUri.path == 'io') { 379 resolvedUri.path == 'io') {
387 // TODO(ahe): Get rid of mockableLibraryUsed when test.dart 380 // TODO(ahe): Get rid of mockableLibraryUsed when test.dart
388 // supports this use case better. 381 // supports this use case better.
389 mockableLibraryUsed = true; 382 mockableLibraryUsed = true;
390 } 383 }
391 return libraryRoot.resolve("lib/$path"); 384 return location;
392 }
393
394 Uri resolvePatchUri(String dartLibraryPath) {
395 String patchPath = lookupPatchPath(dartLibraryPath);
396 if (patchPath == null) return null;
397 return libraryRoot.resolve(patchPath);
398 } 385 }
399 386
400 Uri translatePackageUri(Spannable node, Uri uri) { 387 Uri translatePackageUri(Spannable node, Uri uri) {
401 try { 388 try {
402 checkValidPackageUri(uri); 389 checkValidPackageUri(uri);
403 } on ArgumentError catch (e) { 390 } on ArgumentError catch (e) {
404 reporter.reportErrorMessage( 391 reporter.reportErrorMessage(
405 node, 392 node,
406 MessageKind.INVALID_PACKAGE_URI, 393 MessageKind.INVALID_PACKAGE_URI,
407 {'uri': uri, 'exception': e.message}); 394 {'uri': uri, 'exception': e.message});
408 return null; 395 return null;
409 } 396 }
410 return packages.resolve(uri, 397 return packages.resolve(uri,
411 notFound: (Uri notFound) { 398 notFound: (Uri notFound) {
412 reporter.reportErrorMessage( 399 reporter.reportErrorMessage(
413 node, 400 node,
414 MessageKind.LIBRARY_NOT_FOUND, 401 MessageKind.LIBRARY_NOT_FOUND,
415 {'resolvedUri': uri}); 402 {'resolvedUri': uri});
416 return null; 403 return null;
417 }); 404 });
418 } 405 }
419 406
420 Future<elements.LibraryElement> analyzeUri( 407 Future<elements.LibraryElement> analyzeUri(
421 Uri uri, 408 Uri uri,
422 {bool skipLibraryWithPartOfTag: true}) { 409 {bool skipLibraryWithPartOfTag: true}) {
410 List<Future> setupFutures = new List<Future>();
411 if (sdkLibraries == null) {
412 setupFutures.add(setupSdk());
413 }
423 if (packages == null) { 414 if (packages == null) {
424 return setupPackages(uri).then((_) => super.analyzeUri(uri)); 415 setupFutures.add(setupPackages(uri));
425 } 416 }
426 return super.analyzeUri( 417 return Future.wait(setupFutures).then((_) => super.analyzeUri(uri));
427 uri, skipLibraryWithPartOfTag: skipLibraryWithPartOfTag);
428 } 418 }
429 419
430 Future setupPackages(Uri uri) { 420 Future setupPackages(Uri uri) {
431 if (packageRoot != null) { 421 if (packageRoot != null) {
432 // Use "non-file" packages because the file version requires a [Directory] 422 // Use "non-file" packages because the file version requires a [Directory]
433 // and we can't depend on 'dart:io' classes. 423 // and we can't depend on 'dart:io' classes.
434 packages = new NonFilePackagesDirectoryPackages(packageRoot); 424 packages = new NonFilePackagesDirectoryPackages(packageRoot);
435 } else if (packageConfig != null) { 425 } else if (packageConfig != null) {
436 return callUserProvider(packageConfig).then((packageConfigContents) { 426 return callUserProvider(packageConfig).then((packageConfigContents) {
437 if (packageConfigContents is String) { 427 if (packageConfigContents is String) {
(...skipping 20 matching lines...) Expand all
458 packages = Packages.noPackages; 448 packages = Packages.noPackages;
459 } else { 449 } else {
460 return callUserPackagesDiscovery(uri).then((p) { 450 return callUserPackagesDiscovery(uri).then((p) {
461 packages = p; 451 packages = p;
462 }); 452 });
463 } 453 }
464 } 454 }
465 return new Future.value(); 455 return new Future.value();
466 } 456 }
467 457
458 Future<Null> setupSdk() {
459 if (sdkLibraries == null) {
460 return platform_configuration.load(platformConfigUri, provider)
461 .then((Map<String, Uri> mapping) {
462 sdkLibraries = mapping;
463 });
464 } else {
465 // The incremental compiler sets up the sdk before run.
466 // Therefore this will be called a second time.
467 return new Future.value(null);
468 }
469 }
470
468 Future<bool> run(Uri uri) { 471 Future<bool> run(Uri uri) {
469 log('Allowed library categories: $allowedLibraryCategories'); 472 log('Using platform configuration at ${platformConfigUri}');
470 473
471 return setupPackages(uri).then((_) { 474 return Future.wait([setupSdk(), setupPackages(uri)]).then((_) {
475 assert(sdkLibraries != null);
472 assert(packages != null); 476 assert(packages != null);
473 477
474 return super.run(uri).then((bool success) { 478 return super.run(uri).then((bool success) {
475 int cumulated = 0; 479 int cumulated = 0;
476 for (final task in tasks) { 480 for (final task in tasks) {
477 int elapsed = task.timing; 481 int elapsed = task.timing;
478 if (elapsed != 0) { 482 if (elapsed != 0) {
479 cumulated += elapsed; 483 cumulated += elapsed;
480 log('${task.name} took ${elapsed}msec'); 484 log('${task.name} took ${elapsed}msec');
481 for (String subtask in task.subtasks) { 485 for (String subtask in task.subtasks) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 Future<Packages> callUserPackagesDiscovery(Uri uri) { 556 Future<Packages> callUserPackagesDiscovery(Uri uri) {
553 try { 557 try {
554 return userPackagesDiscoveryTask.measure( 558 return userPackagesDiscoveryTask.measure(
555 () => packagesDiscoveryProvider(uri)); 559 () => packagesDiscoveryProvider(uri));
556 } catch (ex, s) { 560 } catch (ex, s) {
557 diagnoseCrashInUserCode('Uncaught exception in package discovery', ex, s); 561 diagnoseCrashInUserCode('Uncaught exception in package discovery', ex, s);
558 rethrow; 562 rethrow;
559 } 563 }
560 } 564 }
561 565
562
563 fromEnvironment(String name) => environment[name]; 566 fromEnvironment(String name) => environment[name];
564 567
565 library_info.LibraryInfo lookupLibraryInfo(String libraryName) { 568 Uri lookupLibraryUri(String libraryName) {
566 return library_info.libraries[libraryName]; 569 assert(invariant(NO_LOCATION_SPANNABLE,
570 sdkLibraries != null, message: "setupSdk() has not been run"));
571 return sdkLibraries[libraryName];
572 }
573
574 Uri resolvePatchUri(String libraryName) {
575 return backend.resolvePatchUri(libraryName, platformConfigUri);
567 } 576 }
568 } 577 }
OLDNEW
« no previous file with comments | « create_sdk.gyp ('k') | pkg/compiler/lib/src/common/backend_api.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698