Index: pkg/compiler/lib/src/resolved_uri_translator.dart |
diff --git a/pkg/compiler/lib/src/resolved_uri_translator.dart b/pkg/compiler/lib/src/resolved_uri_translator.dart |
index e2bf95407d119f58e38cbdfaf6b6efe019629379..ecd7d0a633b361a424fe5425e911a310c9b0e4aa 100644 |
--- a/pkg/compiler/lib/src/resolved_uri_translator.dart |
+++ b/pkg/compiler/lib/src/resolved_uri_translator.dart |
@@ -10,8 +10,9 @@ import 'util/emptyset.dart'; |
/// system readable URIs. |
abstract class ResolvedUriTranslator { |
factory ResolvedUriTranslator( |
- Map<String, Uri> sdkLibraries, DiagnosticReporter reporter) = |
- _ResolvedUriTranslator; |
+ Map<String, Uri> sdkLibraries, |
+ DiagnosticReporter reporter, |
+ Uri platformConfigUri) = _ResolvedUriTranslator; |
/// The set of platform libraries reported as unsupported. |
/// |
@@ -76,11 +77,13 @@ class ForwardingResolvedUriTranslator implements ResolvedUriTranslator { |
class _ResolvedUriTranslator implements ResolvedUriTranslator { |
final Map<String, Uri> _sdkLibraries; |
final DiagnosticReporter _reporter; |
+ final Uri _platformConfigUri; |
Set<Uri> disallowedLibraryUris = new Set<Uri>(); |
bool mockableLibraryUsed = false; |
- _ResolvedUriTranslator(this._sdkLibraries, this._reporter); |
+ _ResolvedUriTranslator( |
+ this._sdkLibraries, this._reporter, this._platformConfigUri); |
Map<String, Uri> get sdkLibraries => _sdkLibraries; |
@@ -136,9 +139,27 @@ class _ResolvedUriTranslator implements ResolvedUriTranslator { |
} |
if (location.scheme == "unsupported") { |
- _reporter.reportErrorMessage(spannable, MessageKind.LIBRARY_NOT_SUPPORTED, |
- {'resolvedUri': resolvedUri}); |
- registerDisallowedLibraryUse(resolvedUri); |
+ if (location.path == "") { |
+ _reporter.reportErrorMessage(spannable, |
+ MessageKind.LIBRARY_NOT_SUPPORTED, {'resolvedUri': resolvedUri}); |
+ registerDisallowedLibraryUse(resolvedUri); |
+ } else { |
+ // If the specification includes a path, we treat it as "partially" |
+ // unsupported: it is allowed to be imported unconditionally, but we |
+ // will not expose it as being supported in the const variable |
+ // `dart.library.name`. |
+ // |
+ // This is a stopgap measure to support packages like `http` that need |
+ // to import `dart:io` conditionally. Once config-imports are supported |
+ // in the language, we can make it an error again to import it |
+ // unconditionally. |
+ // |
+ // The plaform configuration files contain a URI of the form |
+ // `unsupported:path/to/library.dart` to indicate this partially |
+ // supported mode. We resolve the path with respect to the configuration |
+ // file. |
+ return _platformConfigUri.resolve(location.path); |
+ } |
return null; |
} |