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

Unified Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 2188563002: Issue 26748. Apply existing import/export elements to corresponding directive nodes in DirectiveRes… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b662891b96969b4f9fd92968528d9b2baf52cdaa..0705295f01673514941ebf97465f1e01d875ea71 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2855,10 +2855,12 @@ class DeclarationResolver extends RecursiveAstVisitor<Object>
* The resulting AST must have everything resolved that would have been resolved
* by a [DirectiveElementBuilder].
*/
-class DirectiveResolver extends SimpleAstVisitor with ExistingElementResolver {
+class DirectiveResolver extends SimpleAstVisitor {
+ LibraryElement _enclosingLibrary;
+
@override
void visitCompilationUnit(CompilationUnit node) {
- _enclosingUnit = node.element;
+ _enclosingLibrary = node.element.library;
for (Directive directive in node.directives) {
directive.accept(this);
}
@@ -2866,124 +2868,31 @@ class DirectiveResolver extends SimpleAstVisitor with ExistingElementResolver {
@override
void visitExportDirective(ExportDirective node) {
- String uri = _getStringValue(node.uri);
- if (uri != null) {
- LibraryElement library = _enclosingUnit.library;
- Source source = _enclosingUnit.context.sourceFactory
- .resolveUri(_enclosingUnit.source, uri);
- ExportElement exportElement = _findExport(node, library.exports, source);
- node.element = exportElement;
- } else {
- node.element = null;
+ int nodeOffset = node.offset;
+ node.element = null;
+ for (ExportElement element in _enclosingLibrary.exports) {
+ if (element.nameOffset == nodeOffset) {
+ node.element = element;
+ break;
+ }
}
}
@override
void visitImportDirective(ImportDirective node) {
- String uri = _getStringValue(node.uri);
- if (uri != null) {
- LibraryElement library = _enclosingUnit.library;
- Source source = _enclosingUnit.context.sourceFactory
- .resolveUri(_enclosingUnit.source, uri);
- ImportElement importElement = _findImport(node, library.imports, source);
- node.element = importElement;
- } else {
- node.element = null;
+ int nodeOffset = node.offset;
+ node.element = null;
+ for (ImportElement element in _enclosingLibrary.imports) {
+ if (element.nameOffset == nodeOffset) {
+ node.element = element;
+ break;
+ }
}
}
@override
void visitLibraryDirective(LibraryDirective node) {
- node.element = _enclosingUnit.library;
- }
-
- /**
- * Return the export element from the given list of [exports] whose library
- * has the given [source]. Throw an [ElementMismatchException] if an element
- * corresponding to the identifier cannot be found.
- */
- ExportElement _findExport(
- ExportDirective node, List<ExportElement> exports, Source source) {
- if (source == null) {
- return null;
- }
- int length = exports.length;
- for (int i = 0; i < length; i++) {
- ExportElement export = exports[i];
- if (export.exportedLibrary.source == source) {
- // Must have the same offset.
- if (export.nameOffset != node.offset) {
- continue;
- }
- // In general we should also match combinators.
- // But currently we invalidate element model on any directive change.
- // So, either the combinators are the same, or we build new elements.
- return export;
- }
- }
- if (!_enclosingUnit.context.exists(source)) {
- return null;
- }
- _mismatch("Could not find export element for '$source'", node);
- return null; // Never reached
- }
-
- /**
- * Return the import element from the given list of [imports] whose library
- * has the given [source]. Throw an [ElementMismatchException] if an element
- * corresponding to the [source] cannot be found.
- */
- ImportElement _findImport(
- ImportDirective node, List<ImportElement> imports, Source source) {
- if (source == null) {
- return null;
- }
- SimpleIdentifier prefix = node.prefix;
- bool foundSource = false;
- int length = imports.length;
- for (int i = 0; i < length; i++) {
- ImportElement element = imports[i];
- if (element.importedLibrary.source == source) {
- foundSource = true;
- // Must have the same offset.
- if (element.nameOffset != node.offset) {
- continue;
- }
- // Must have the same prefix.
- if (element.prefix?.displayName != prefix?.name) {
- continue;
- }
- // In general we should also match combinators.
- // But currently we invalidate element model on any directive change.
- // So, either the combinators are the same, or we build new elements.
- return element;
- }
- }
- if (!_enclosingUnit.context.exists(source)) {
- return null;
- }
- if (foundSource) {
- if (prefix == null) {
- _mismatch(
- "Could not find import element for '$source' with no prefix", node);
- }
- _mismatch(
- "Could not find import element for '$source' with prefix ${prefix.name}",
- node);
- }
- _mismatch("Could not find any import element for '$source'", node);
- return null; // Never reached
- }
-
- /**
- * Return the value of the given string [literal], or `null` if the string is
- * not a constant string without any string interpolation.
- */
- String _getStringValue(StringLiteral literal) {
- if (literal is StringInterpolation) {
- return null;
- }
- return literal.stringValue;
+ node.element = _enclosingLibrary;
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698