| Index: pkg/compiler/lib/src/apiimpl.dart
|
| diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
|
| index 7620392ddc90c2896b8ae80714893a0355bd682f..33f2e7f9dc01a49a15aa4e8585adf97d4d7955d2 100644
|
| --- a/pkg/compiler/lib/src/apiimpl.dart
|
| +++ b/pkg/compiler/lib/src/apiimpl.dart
|
| @@ -14,7 +14,6 @@ import 'package:package_config/src/packages_impl.dart' show
|
| NonFilePackagesDirectoryPackages;
|
| import 'package:package_config/src/util.dart' show
|
| checkValidPackageUri;
|
| -import 'package:sdk_library_metadata/libraries.dart' as library_info;
|
|
|
| import '../compiler_new.dart' as api;
|
| import 'commandline_options.dart';
|
| @@ -28,17 +27,24 @@ import 'diagnostics/messages.dart' show
|
| Message;
|
| import 'elements/elements.dart' as elements;
|
| import 'io/source_file.dart';
|
| +import 'platform_configuration.dart' as platform_configuration;
|
| import 'script.dart';
|
|
|
| const bool forceIncrementalSupport =
|
| const bool.fromEnvironment('DART2JS_EXPERIMENTAL_INCREMENTAL_SUPPORT');
|
|
|
| +/// Locations of the platform descriptor files relative to the library root.
|
| +const String _clientPlatform = "lib/dart_client.platform";
|
| +const String _serverPlatform = "lib/dart_server.platform";
|
| +const String _sharedPlatform = "lib/dart_shared.platform";
|
| +const String _dart2dartPlatform = "lib/dart2dart.platform";
|
| +
|
| /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
|
| /// sources.
|
| class CompilerImpl extends Compiler {
|
| api.CompilerInput provider;
|
| api.CompilerDiagnostics handler;
|
| - final Uri libraryRoot;
|
| + final Uri platformConfigUri;
|
| final Uri packageConfig;
|
| final Uri packageRoot;
|
| final api.PackagesDiscoveryProvider packagesDiscoveryProvider;
|
| @@ -46,23 +52,29 @@ class CompilerImpl extends Compiler {
|
| List<String> options;
|
| Map<String, dynamic> environment;
|
| bool mockableLibraryUsed = false;
|
| - final Set<library_info.Category> allowedLibraryCategories;
|
| +
|
| + /// A mapping of the dart: library-names to their location.
|
| + ///
|
| + /// Initialized in [setupSdk].
|
| + Map<String, Uri> sdkLibraries;
|
|
|
| GenericTask userHandlerTask;
|
| GenericTask userProviderTask;
|
| GenericTask userPackagesDiscoveryTask;
|
|
|
| + Uri get libraryRoot => platformConfigUri.resolve(".");
|
| +
|
| CompilerImpl(this.provider,
|
| api.CompilerOutput outputProvider,
|
| this.handler,
|
| - this.libraryRoot,
|
| + Uri libraryRoot,
|
| this.packageRoot,
|
| List<String> options,
|
| this.environment,
|
| [this.packageConfig,
|
| this.packagesDiscoveryProvider])
|
| : this.options = options,
|
| - this.allowedLibraryCategories = getAllowedLibraryCategories(options),
|
| + this.platformConfigUri = resolvePlatformConfig(libraryRoot, options),
|
| super(
|
| outputProvider: outputProvider,
|
| enableTypeAssertions: hasOption(options, Flags.enableCheckedMode),
|
| @@ -175,31 +187,35 @@ class CompilerImpl extends Compiler {
|
| return const <String>[];
|
| }
|
|
|
| - static Set<library_info.Category> getAllowedLibraryCategories(
|
| - List<String> options) {
|
| - Iterable<library_info.Category> categories =
|
| - extractCsvOption(options, '--categories=')
|
| - .map(library_info.parseCategory)
|
| - .where((x) => x != null);
|
| - if (categories.isEmpty) {
|
| - return new Set.from([library_info.Category.client]);
|
| + static Uri resolvePlatformConfig(Uri libraryRoot,
|
| + List<String> options) {
|
| + String platformConfigPath =
|
| + extractStringOption(options, "--platform-config=", null);
|
| + if (platformConfigPath != null) {
|
| + return libraryRoot.resolve(platformConfigPath);
|
| + } else if (hasOption(options, '--output-type=dart')) {
|
| + return libraryRoot.resolve(_dart2dartPlatform);
|
| + } else {
|
| + Iterable<String> categories = extractCsvOption(options, '--categories=');
|
| + if (categories.length == 0) {
|
| + return libraryRoot.resolve(_clientPlatform);
|
| + }
|
| + assert(categories.length <= 2);
|
| + if (categories.contains("Client")) {
|
| + if (categories.contains("Server")) {
|
| + return libraryRoot.resolve(_sharedPlatform);
|
| + }
|
| + return libraryRoot.resolve(_clientPlatform);
|
| + }
|
| + assert(categories.contains("Server"));
|
| + return libraryRoot.resolve(_serverPlatform);
|
| }
|
| - return new Set.from(categories);
|
| }
|
|
|
| static bool hasOption(List<String> options, String option) {
|
| return options.indexOf(option) >= 0;
|
| }
|
|
|
| - String lookupPatchPath(String dartLibraryName) {
|
| - library_info.LibraryInfo info = lookupLibraryInfo(dartLibraryName);
|
| - if (info == null) return null;
|
| - if (!info.isDart2jsLibrary) return null;
|
| - String path = info.dart2jsPatchPath;
|
| - if (path == null) return null;
|
| - return "lib/$path";
|
| - }
|
| -
|
| void log(message) {
|
| callUserHandler(
|
| null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
|
| @@ -304,81 +320,58 @@ class CompilerImpl extends Compiler {
|
| }
|
|
|
| /// Translates "resolvedUri" with scheme "dart" to a [uri] resolved relative
|
| - /// to [libraryRoot] according to the information in [library_info.libraries].
|
| + /// to [platformConfigUri] according to the information in the file at
|
| + /// [platformConfigUri].
|
| ///
|
| /// Returns null and emits an error if the library could not be found or
|
| /// imported into [importingLibrary].
|
| ///
|
| - /// If [importingLibrary] is a platform or patch library all dart2js libraries
|
| - /// can be resolved. Otherwise only libraries with categories in
|
| - /// [allowedLibraryCategories] can be resolved.
|
| + /// Internal libraries (whose name starts with '_') can be only resolved if
|
| + /// [importingLibrary] is a platform or patch library.
|
| Uri translateDartUri(elements.LibraryElement importingLibrary,
|
| Uri resolvedUri, Spannable spannable) {
|
|
|
| - library_info.LibraryInfo libraryInfo = lookupLibraryInfo(resolvedUri.path);
|
| + Uri location = lookupLibraryUri(resolvedUri.path);
|
|
|
| - bool allowInternalLibraryAccess = false;
|
| - if (importingLibrary != null) {
|
| - if (importingLibrary.isPlatformLibrary || importingLibrary.isPatch) {
|
| - allowInternalLibraryAccess = true;
|
| - } else if (importingLibrary.canonicalUri.path.contains(
|
| - 'sdk/tests/compiler/dart2js_native')) {
|
| - allowInternalLibraryAccess = true;
|
| - }
|
| + if (location == null) {
|
| + reporter.reportErrorMessage(
|
| + spannable,
|
| + MessageKind.LIBRARY_NOT_FOUND,
|
| + {'resolvedUri': resolvedUri});
|
| + return null;
|
| }
|
|
|
| - String computePath() {
|
| - if (libraryInfo == null) {
|
| - return null;
|
| - } else if (!libraryInfo.isDart2jsLibrary) {
|
| - return null;
|
| - } else {
|
| - if (libraryInfo.isInternal &&
|
| - !allowInternalLibraryAccess) {
|
| - if (importingLibrary != null) {
|
| - reporter.reportErrorMessage(
|
| - spannable,
|
| - MessageKind.INTERNAL_LIBRARY_FROM,
|
| - {'resolvedUri': resolvedUri,
|
| - 'importingUri': importingLibrary.canonicalUri});
|
| - } else {
|
| - reporter.reportErrorMessage(
|
| - spannable,
|
| - MessageKind.INTERNAL_LIBRARY,
|
| - {'resolvedUri': resolvedUri});
|
| - registerDisallowedLibraryUse(resolvedUri);
|
| - }
|
| - return null;
|
| - } else if (!allowInternalLibraryAccess &&
|
| - !allowedLibraryCategories.any(libraryInfo.categories.contains)) {
|
| - registerDisallowedLibraryUse(resolvedUri);
|
| - // TODO(sigurdm): Currently we allow the sdk libraries to import
|
| - // libraries from any category. We might want to revisit this.
|
| - return null;
|
| + if (resolvedUri.path.startsWith('_') ) {
|
| + bool allowInternalLibraryAccess = importingLibrary != null &&
|
| + (importingLibrary.isPlatformLibrary ||
|
| + importingLibrary.isPatch ||
|
| + importingLibrary.canonicalUri.path
|
| + .contains('sdk/tests/compiler/dart2js_native'));
|
| +
|
| + if (!allowInternalLibraryAccess) {
|
| + if (importingLibrary != null) {
|
| + reporter.reportErrorMessage(
|
| + spannable,
|
| + MessageKind.INTERNAL_LIBRARY_FROM,
|
| + {'resolvedUri': resolvedUri,
|
| + 'importingUri': importingLibrary.canonicalUri});
|
| } else {
|
| - return (libraryInfo.dart2jsPath != null)
|
| - ? libraryInfo.dart2jsPath
|
| - : libraryInfo.path;
|
| + reporter.reportErrorMessage(
|
| + spannable,
|
| + MessageKind.INTERNAL_LIBRARY,
|
| + {'resolvedUri': resolvedUri});
|
| + registerDisallowedLibraryUse(resolvedUri);
|
| }
|
| + return null;
|
| }
|
| }
|
|
|
| - String path = computePath();
|
| -
|
| - if (path == null) {
|
| - if (libraryInfo == null) {
|
| - reporter.reportErrorMessage(
|
| - spannable,
|
| - MessageKind.LIBRARY_NOT_FOUND,
|
| - {'resolvedUri': resolvedUri});
|
| - } else {
|
| - reporter.reportErrorMessage(
|
| - spannable,
|
| - MessageKind.LIBRARY_NOT_SUPPORTED,
|
| - {'resolvedUri': resolvedUri});
|
| - }
|
| - // TODO(johnniwinther): Support signaling the error through the returned
|
| - // value.
|
| + if (location.scheme == "unsupported") {
|
| + reporter.reportErrorMessage(
|
| + spannable,
|
| + MessageKind.LIBRARY_NOT_SUPPORTED,
|
| + {'resolvedUri': resolvedUri});
|
| + registerDisallowedLibraryUse(resolvedUri);
|
| return null;
|
| }
|
|
|
| @@ -388,13 +381,7 @@ class CompilerImpl extends Compiler {
|
| // supports this use case better.
|
| mockableLibraryUsed = true;
|
| }
|
| - return libraryRoot.resolve("lib/$path");
|
| - }
|
| -
|
| - Uri resolvePatchUri(String dartLibraryPath) {
|
| - String patchPath = lookupPatchPath(dartLibraryPath);
|
| - if (patchPath == null) return null;
|
| - return libraryRoot.resolve(patchPath);
|
| + return location;
|
| }
|
|
|
| Uri translatePackageUri(Spannable node, Uri uri) {
|
| @@ -420,11 +407,14 @@ class CompilerImpl extends Compiler {
|
| Future<elements.LibraryElement> analyzeUri(
|
| Uri uri,
|
| {bool skipLibraryWithPartOfTag: true}) {
|
| + List<Future> setupFutures = new List<Future>();
|
| + if (sdkLibraries == null) {
|
| + setupFutures.add(setupSdk());
|
| + }
|
| if (packages == null) {
|
| - return setupPackages(uri).then((_) => super.analyzeUri(uri));
|
| + setupFutures.add(setupPackages(uri));
|
| }
|
| - return super.analyzeUri(
|
| - uri, skipLibraryWithPartOfTag: skipLibraryWithPartOfTag);
|
| + return Future.wait(setupFutures).then((_) => super.analyzeUri(uri));
|
| }
|
|
|
| Future setupPackages(Uri uri) {
|
| @@ -465,10 +455,24 @@ class CompilerImpl extends Compiler {
|
| return new Future.value();
|
| }
|
|
|
| + Future<Null> setupSdk() {
|
| + if (sdkLibraries == null) {
|
| + return platform_configuration.load(platformConfigUri, provider)
|
| + .then((Map<String, Uri> mapping) {
|
| + sdkLibraries = mapping;
|
| + });
|
| + } else {
|
| + // The incremental compiler sets up the sdk before run.
|
| + // Therefore this will be called a second time.
|
| + return new Future.value(null);
|
| + }
|
| + }
|
| +
|
| Future<bool> run(Uri uri) {
|
| - log('Allowed library categories: $allowedLibraryCategories');
|
| + log('Using platform configuration at ${platformConfigUri}');
|
|
|
| - return setupPackages(uri).then((_) {
|
| + return Future.wait([setupSdk(), setupPackages(uri)]).then((_) {
|
| + assert(sdkLibraries != null);
|
| assert(packages != null);
|
|
|
| return super.run(uri).then((bool success) {
|
| @@ -559,10 +563,15 @@ class CompilerImpl extends Compiler {
|
| }
|
| }
|
|
|
| -
|
| fromEnvironment(String name) => environment[name];
|
|
|
| - library_info.LibraryInfo lookupLibraryInfo(String libraryName) {
|
| - return library_info.libraries[libraryName];
|
| + Uri lookupLibraryUri(String libraryName) {
|
| + assert(invariant(NO_LOCATION_SPANNABLE,
|
| + sdkLibraries != null, message: "setupSdk() has not been run"));
|
| + return sdkLibraries[libraryName];
|
| + }
|
| +
|
| + Uri resolvePatchUri(String libraryName) {
|
| + return backend.resolvePatchUri(libraryName, platformConfigUri);
|
| }
|
| }
|
|
|