| 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; | 
| } | 
| } | 
|  | 
|  |