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

Unified Diff: pkg/analyzer/lib/src/summary/prelink.dart

Issue 2353433002: Use configurations and declared variables to select import/export URIs during prelinking. (Closed)
Patch Set: Cache selected URI. Created 4 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/analyzer/lib/src/summary/link.dart ('k') | pkg/analyzer/lib/src/summary/pub_summary.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/summary/prelink.dart
diff --git a/pkg/analyzer/lib/src/summary/prelink.dart b/pkg/analyzer/lib/src/summary/prelink.dart
index ec947f00871e4cf6b57b96a66afd1665791bb76a..062676ee924d98a48bba11d8532392171bfd8492 100644
--- a/pkg/analyzer/lib/src/summary/prelink.dart
+++ b/pkg/analyzer/lib/src/summary/prelink.dart
@@ -17,11 +17,18 @@ import 'package:analyzer/src/summary/name_filter.dart';
* declarations) will be retrieved using [getImport].
*/
LinkedLibraryBuilder prelink(UnlinkedUnit definingUnit, GetPartCallback getPart,
- GetImportCallback getImport) {
- return new _Prelinker(definingUnit, getPart, getImport).prelink();
+ GetImportCallback getImport, GetDeclaredVariable getDeclaredVariable) {
+ return new _Prelinker(definingUnit, getPart, getImport, getDeclaredVariable)
+ .prelink();
}
/**
+ * Return the raw string value of the variable with the given [name],
+ * or `null` of the variable is not defined.
+ */
+typedef String GetDeclaredVariable(String name);
+
+/**
* Type of the callback used by the prelinker to obtain public namespace
* information about libraries imported by the library to be prelinked (and
* the transitive closure of parts and exports reachable from those libraries).
@@ -121,6 +128,7 @@ class _Prelinker {
final UnlinkedUnit definingUnit;
final GetPartCallback getPart;
final GetImportCallback getImport;
+ final GetDeclaredVariable getDeclaredVariable;
/**
* Cache of values returned by [getImport].
@@ -161,7 +169,8 @@ class _Prelinker {
final List<Map<String, _Meaning>> dependencyToPublicNamespace =
<Map<String, _Meaning>>[null];
- _Prelinker(this.definingUnit, this.getPart, this.getImport) {
+ _Prelinker(this.definingUnit, this.getPart, this.getImport,
+ this.getDeclaredVariable) {
partCache[null] = definingUnit;
importCache[null] = definingUnit.publicNamespace;
}
@@ -231,7 +240,9 @@ class _Prelinker {
getImportCached(relativeUri);
if (exportedNamespace != null) {
for (UnlinkedExportPublic export in exportedNamespace.exports) {
- String exportUri = resolveUri(relativeUri, export.uri);
+ String relativeExportUri =
+ _selectUri(export.uri, export.configurations);
+ String exportUri = resolveUri(relativeUri, relativeExportUri);
NameFilter newFilter = filter.merge(
new NameFilter.forUnlinkedCombinators(export.combinators));
aggregatePublicNamespace(exportUri)
@@ -247,6 +258,7 @@ class _Prelinker {
seenUris.remove(relativeUri);
}
}
+
chaseExports(NameFilter.identity, relativeUri, new Set<String>());
return exportNamespace;
}
@@ -385,7 +397,9 @@ class _Prelinker {
* return value is the index of the imported library in [dependencies].
*/
int handleImport(UnlinkedImport import) {
- String uri = import.isImplicit ? 'dart:core' : import.uri;
+ String uri = import.isImplicit
+ ? 'dart:core'
+ : _selectUri(import.uri, import.configurations);
Map<String, _Meaning> targetNamespace = null;
if (import.prefixReference != 0) {
// The name introduced by an import declaration can't have a prefix of
@@ -483,9 +497,11 @@ class _Prelinker {
// Fill in imported and exported names.
List<int> importDependencies =
definingUnit.imports.map(handleImport).toList();
- List<int> exportDependencies = definingUnit.publicNamespace.exports
- .map((UnlinkedExportPublic exp) => uriToDependency[exp.uri])
- .toList();
+ List<int> exportDependencies =
+ definingUnit.publicNamespace.exports.map((UnlinkedExportPublic exp) {
+ String uri = _selectUri(exp.uri, exp.configurations);
+ return uriToDependency[uri];
+ }).toList();
// Link each compilation unit.
List<LinkedUnitBuilder> linkedUnits = units.map(linkUnit).toList();
@@ -511,4 +527,18 @@ class _Prelinker {
.toString();
}
}
+
+ /**
+ * Return the URI of the first configuration from the given [configurations]
+ * which condition is satisfied, or the [defaultUri].
+ */
+ String _selectUri(
+ String defaultUri, List<UnlinkedConfiguration> configurations) {
+ for (UnlinkedConfiguration configuration in configurations) {
+ if (getDeclaredVariable(configuration.name) == configuration.value) {
+ return configuration.uri;
+ }
+ }
+ return defaultUri;
+ }
}
« no previous file with comments | « pkg/analyzer/lib/src/summary/link.dart ('k') | pkg/analyzer/lib/src/summary/pub_summary.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698