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

Unified Diff: pkg/compiler/lib/src/compiler.dart

Issue 1338783002: Show import chains for unsupported dart:* library imports. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Update cf. comments. Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/apiimpl.dart ('k') | pkg/compiler/lib/src/diagnostics/messages.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/compiler.dart
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 249176adc4563fda5ae09fd1640c3a16871d5a01..6ed7c0515287d7367885ba7b00de66a246bf6697 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -133,7 +133,8 @@ import 'universe/universe.dart' show
Selector,
Universe;
import 'util/util.dart' show
- Link;
+ Link,
+ Setlet;
import 'world.dart' show
World;
@@ -275,6 +276,11 @@ abstract class Compiler implements DiagnosticListener {
List<Uri> librariesToAnalyzeWhenRun;
+ /// The set of platform libraries reported as unsupported.
+ ///
+ /// For instance when importing 'dart:io' without '--categories=Server'.
+ Set<Uri> disallowedLibraryUris = new Setlet<Uri>();
+
Tracer tracer;
CompilerTask measuredTask;
@@ -770,6 +776,72 @@ abstract class Compiler implements DiagnosticListener {
return backend.onLibraryScanned(library, loader);
}
+ /// Compute the set of distinct import chains to the library at [uri] within
+ /// [loadedLibraries].
+ ///
+ /// The chains are strings of the form
+ ///
+ /// <main-uri> => <intermediate-uri1> => <intermediate-uri2> => <uri>
+ ///
+ Set<String> computeImportChainsFor(LoadedLibraries loadedLibraries, Uri uri) {
+ // TODO(johnniwinther): Move computation of dependencies to the library
+ // loader.
+ Uri rootUri = loadedLibraries.rootUri;
+ Set<String> importChains = new Set<String>();
+ // The maximum number of full imports chains to process.
+ final int chainLimit = 10000;
+ // The maximum number of imports chains to show.
+ final int compactChainLimit = verbose ? 20 : 10;
+ int chainCount = 0;
+ loadedLibraries.forEachImportChain(uri,
+ callback: (Link<Uri> importChainReversed) {
+ Link<CodeLocation> compactImportChain = const Link<CodeLocation>();
+ CodeLocation currentCodeLocation =
+ new UriLocation(importChainReversed.head);
+ compactImportChain = compactImportChain.prepend(currentCodeLocation);
+ for (Link<Uri> link = importChainReversed.tail;
+ !link.isEmpty;
+ link = link.tail) {
+ Uri uri = link.head;
+ if (!currentCodeLocation.inSameLocation(uri)) {
+ currentCodeLocation =
+ verbose ? new UriLocation(uri) : new CodeLocation(uri);
+ compactImportChain =
+ compactImportChain.prepend(currentCodeLocation);
+ }
+ }
+ String importChain =
+ compactImportChain.map((CodeLocation codeLocation) {
+ return codeLocation.relativize(rootUri);
+ }).join(' => ');
+
+ if (!importChains.contains(importChain)) {
+ if (importChains.length > compactChainLimit) {
+ importChains.add('...');
+ return false;
+ } else {
+ importChains.add(importChain);
+ }
+ }
+
+ chainCount++;
+ if (chainCount > chainLimit) {
+ // Assume there are more import chains.
+ importChains.add('...');
+ return false;
+ }
+ return true;
+ });
+ return importChains;
+ }
+
+ /// Register that [uri] was recognized but disallowed as a dependency.
+ ///
+ /// For instance import of 'dart:io' without '--categories=Server'.
+ void registerDisallowedLibraryUse(Uri uri) {
+ disallowedLibraryUris.add(uri);
+ }
+
/// This method is called when all new libraries loaded through
/// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
/// have been computed.
@@ -780,60 +852,26 @@ abstract class Compiler implements DiagnosticListener {
/// libraries.
Future onLibrariesLoaded(LoadedLibraries loadedLibraries) {
return new Future.sync(() {
+ for (Uri uri in disallowedLibraryUris) {
+ if (loadedLibraries.containsLibrary(uri)) {
+ Set<String> importChains =
+ computeImportChainsFor(loadedLibraries, Uri.parse('dart:io'));
+ reportInfo(NO_LOCATION_SPANNABLE,
+ MessageKind.DISALLOWED_LIBRARY_IMPORT,
+ {'uri': uri,
+ 'importChain': importChains.join(
+ MessageTemplate.DISALLOWED_LIBRARY_IMPORT_PADDING)});
+ }
+ }
+
if (!loadedLibraries.containsLibrary(Uris.dart_core)) {
return null;
}
+
if (!enableExperimentalMirrors &&
loadedLibraries.containsLibrary(Uris.dart_mirrors)) {
- // TODO(johnniwinther): Move computation of dependencies to the library
- // loader.
- Uri rootUri = loadedLibraries.rootUri;
- Set<String> importChains = new Set<String>();
- // The maximum number of full imports chains to process.
- final int chainLimit = 10000;
- // The maximum number of imports chains to show.
- final int compactChainLimit = verbose ? 20 : 10;
- int chainCount = 0;
- loadedLibraries.forEachImportChain(Uris.dart_mirrors,
- callback: (Link<Uri> importChainReversed) {
- Link<CodeLocation> compactImportChain = const Link<CodeLocation>();
- CodeLocation currentCodeLocation =
- new UriLocation(importChainReversed.head);
- compactImportChain = compactImportChain.prepend(currentCodeLocation);
- for (Link<Uri> link = importChainReversed.tail;
- !link.isEmpty;
- link = link.tail) {
- Uri uri = link.head;
- if (!currentCodeLocation.inSameLocation(uri)) {
- currentCodeLocation =
- verbose ? new UriLocation(uri) : new CodeLocation(uri);
- compactImportChain =
- compactImportChain.prepend(currentCodeLocation);
- }
- }
- String importChain =
- compactImportChain.map((CodeLocation codeLocation) {
- return codeLocation.relativize(rootUri);
- }).join(' => ');
-
- if (!importChains.contains(importChain)) {
- if (importChains.length > compactChainLimit) {
- importChains.add('...');
- return false;
- } else {
- importChains.add(importChain);
- }
- }
-
- chainCount++;
- if (chainCount > chainLimit) {
- // Assume there are more import chains.
- importChains.add('...');
- return false;
- }
- return true;
- });
-
+ Set<String> importChains =
+ computeImportChainsFor(loadedLibraries, Uris.dart_mirrors);
if (!backend.supportsReflection) {
reportError(NO_LOCATION_SPANNABLE,
MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND);
« no previous file with comments | « pkg/compiler/lib/src/apiimpl.dart ('k') | pkg/compiler/lib/src/diagnostics/messages.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698