Elements. Migrate lib/src/dart/ast/element_locator.dart

Change-Id: I7b57a239cd21737292224d05b38b86a0dbd4643c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403642
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 8014e35..e874b72 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -698,7 +698,19 @@
     if (node is StringLiteral && node.parent is UriBasedDirective) {
       return null;
     }
-    var element = ElementLocator.locate(node);
+
+    Element? element;
+    switch (node) {
+      case ExportDirective():
+        element = node.element;
+      case ImportDirective():
+        element = node.element;
+      case PartOfDirective():
+        element = node.element;
+      default:
+        element = ElementLocator.locate2(node).asElement;
+    }
+
     if (node is SimpleIdentifier && element is PrefixElement) {
       element = getImportElement(node);
     }
diff --git a/pkg/analysis_server/test/services/refactoring/legacy/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/legacy/abstract_rename.dart
index 10fac2c..24d4a68 100644
--- a/pkg/analysis_server/test/services/refactoring/legacy/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/legacy/abstract_rename.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:test/test.dart';
 
@@ -41,11 +42,24 @@
   /// Creates a new [RenameRefactoring] in [refactoring] for the [Element] of
   /// the [SimpleIdentifier] at the given [search] pattern.
   void createRenameRefactoringAtString(String search) {
-    var identifier = findNode.any(search);
-    var element = ElementLocator.locate(identifier);
-    if (identifier is SimpleIdentifier && element is PrefixElement) {
-      element = getImportElement(identifier);
+    var node = findNode.any(search);
+
+    Element? element;
+    switch (node) {
+      case ExportDirective():
+        element = node.element;
+      case ImportDirective():
+        element = node.element;
+      case PartOfDirective():
+        element = node.element;
+      default:
+        element = ElementLocator.locate2(node).asElement;
     }
+
+    if (node is SimpleIdentifier && element is PrefixElement) {
+      element = getImportElement(node);
+    }
+
     createRenameRefactoringForElement(element);
   }
 
diff --git a/pkg/analyzer/analyzer_use_new_elements.txt b/pkg/analyzer/analyzer_use_new_elements.txt
index 087f1d0..be775d3 100644
--- a/pkg/analyzer/analyzer_use_new_elements.txt
+++ b/pkg/analyzer/analyzer_use_new_elements.txt
@@ -18,7 +18,6 @@
 lib/src/dart/analysis/session.dart
 lib/src/dart/analysis/session_helper.dart
 lib/src/dart/ast/ast.dart
-lib/src/dart/ast/element_locator.dart
 lib/src/dart/ast/extensions.dart
 lib/src/dart/ast/utilities.dart
 lib/src/dart/constant/constant_verifier.dart
diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
index 4c321ed6..24b7dde 100644
--- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
@@ -4,23 +4,13 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 
-/// An object used to locate the [Element] associated with a given [AstNode].
+/// An object used to locate the [Element2] associated with a given [AstNode].
 class ElementLocator {
   /// Return the element associated with the given [node], or `null` if there
   /// is no element associated with the node.
-  static Element? locate(AstNode? node) {
-    if (node == null) return null;
-
-    var mapper = _ElementMapper();
-    return node.accept(mapper);
-  }
-
-  /// Return the element associated with the given [node], or `null` if there
-  /// is no element associated with the node.
   static Element2? locate2(AstNode? node) {
     if (node == null) return null;
 
@@ -30,277 +20,6 @@
 }
 
 /// Visitor that maps nodes to elements.
-class _ElementMapper extends GeneralizingAstVisitor<Element> {
-  @override
-  Element? visitAnnotation(Annotation node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitAssignedVariablePattern(AssignedVariablePattern node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitAssignmentExpression(AssignmentExpression node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitBinaryExpression(BinaryExpression node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitClassDeclaration(ClassDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitClassTypeAlias(ClassTypeAlias node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitCompilationUnit(CompilationUnit node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitConstructorDeclaration(ConstructorDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitConstructorSelector(ConstructorSelector node) {
-    var parent = node.parent;
-    if (parent is EnumConstantArguments) {
-      var parent2 = parent.parent;
-      if (parent2 is EnumConstantDeclaration) {
-        return parent2.constructorElement;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Element? visitDeclaredIdentifier(DeclaredIdentifier node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitDeclaredVariablePattern(DeclaredVariablePattern node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitEnumDeclaration(EnumDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitExportDirective(ExportDirective node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitExtensionDeclaration(ExtensionDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitExtensionOverride(ExtensionOverride node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitFormalParameter(FormalParameter node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitFunctionDeclaration(FunctionDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitFunctionTypeAlias(FunctionTypeAlias node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitGenericTypeAlias(GenericTypeAlias node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitIdentifier(Identifier node) {
-    var parent = node.parent;
-    if (parent is Annotation) {
-      // Type name in Annotation
-      if (identical(parent.name, node) && parent.constructorName == null) {
-        return parent.element;
-      }
-    } else if (parent is ConstructorDeclaration) {
-      // Extra work to map Constructor Declarations to their associated
-      // Constructor Elements
-      var returnType = parent.returnType;
-      if (identical(returnType, node)) {
-        var name = parent.name;
-        if (name != null) {
-          return parent.declaredElement;
-        }
-        var element = node.staticElement;
-        if (element is InterfaceElement) {
-          return element.unnamedConstructor;
-        }
-      } else if (parent.name == node.endToken) {
-        return parent.declaredElement;
-      }
-    } else if (parent is LibraryIdentifier) {
-      var grandParent = parent.parent;
-      if (grandParent is PartOfDirective) {
-        var element = grandParent.element;
-        if (element is LibraryElement) {
-          return element.definingCompilationUnit;
-        }
-      } else if (grandParent is LibraryDirective) {
-        return grandParent.element;
-      }
-    }
-    return node.writeOrReadElement;
-  }
-
-  @override
-  Element? visitImportDirective(ImportDirective node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitImportPrefixReference(ImportPrefixReference node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitIndexExpression(IndexExpression node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitInstanceCreationExpression(InstanceCreationExpression node) {
-    return node.constructorName.staticElement;
-  }
-
-  @override
-  Element? visitLibraryDirective(LibraryDirective node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitMethodDeclaration(MethodDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitMethodInvocation(MethodInvocation node) {
-    return node.methodName.staticElement;
-  }
-
-  @override
-  Element? visitMixinDeclaration(MixinDeclaration node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitNamedType(NamedType node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitPartOfDirective(PartOfDirective node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitPatternField(PatternField node) {
-    return node.element;
-  }
-
-  @override
-  Element? visitPatternFieldName(PatternFieldName node) {
-    var parent = node.parent;
-    if (parent is PatternField) {
-      return parent.element;
-    } else {
-      return null;
-    }
-  }
-
-  @override
-  Element? visitPostfixExpression(PostfixExpression node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitPrefixedIdentifier(PrefixedIdentifier node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitPrefixExpression(PrefixExpression node) {
-    return node.staticElement;
-  }
-
-  @override
-  Element? visitRepresentationConstructorName(
-      RepresentationConstructorName node) {
-    var representation = node.parent as RepresentationDeclaration;
-    return representation.constructorElement;
-  }
-
-  @override
-  Element? visitRepresentationDeclaration(RepresentationDeclaration node) {
-    return node.fieldElement;
-  }
-
-  @override
-  Element? visitStringLiteral(StringLiteral node) {
-    var parent = node.parent;
-    if (parent is ExportDirective) {
-      return parent.element?.exportedLibrary;
-    } else if (parent is ImportDirective) {
-      return parent.element?.importedLibrary;
-    } else if (parent is PartDirective) {
-      var elementUri = parent.element?.uri;
-      if (elementUri is DirectiveUriWithUnit) {
-        return elementUri.unit;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Element? visitTypeParameter(TypeParameter node) {
-    return node.declaredElement;
-  }
-
-  @override
-  Element? visitVariableDeclaration(VariableDeclaration node) {
-    return node.declaredElement;
-  }
-}
-
-/// Visitor that maps nodes to elements.
 class _ElementMapper2 extends GeneralizingAstVisitor<Element2> {
   @override
   Element2? visitAnnotation(Annotation node) {
diff --git a/pkg/analyzer/lib/src/dart/micro/utils.dart b/pkg/analyzer/lib/src/dart/micro/utils.dart
index 4be404e..f762550 100644
--- a/pkg/analyzer/lib/src/dart/micro/utils.dart
+++ b/pkg/analyzer/lib/src/dart/micro/utils.dart
@@ -24,7 +24,19 @@
   if (node is StringLiteral && node.parent is UriBasedDirective) {
     return null;
   }
-  var element = ElementLocator.locate(node);
+
+  Element? element;
+  switch (node) {
+    case ExportDirective():
+      element = node.element;
+    case ImportDirective():
+      element = node.element;
+    case PartOfDirective():
+      element = node.element;
+    default:
+      element = ElementLocator.locate2(node).asElement;
+  }
+
   if (node is SimpleIdentifier && element is PrefixElement) {
     var parent = node.parent;
     if (parent is ImportDirective) {
@@ -33,6 +45,7 @@
       element = _getImportElementInfo(node);
     }
   }
+
   return element;
 }
 
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index 34c5624..5868c17 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer_utilities/testing/tree_string_sink.dart';
@@ -15,584 +14,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ElementLocatorTest);
     defineReflectiveTests(ElementLocatorTest2);
     defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
-class ElementLocatorTest extends PubPackageResolutionTest {
-  test_locate_AssignedVariablePattern() async {
-    await resolveTestCode(r'''
-void f() {
-  int foo;
-  (foo, _) = (0, 1);
-}
-''');
-    var node = findNode.assignedVariablePattern('foo,');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-foo@17
-''');
-  }
-
-  test_locate_AssignmentExpression() async {
-    await resolveTestCode(r'''
-int x = 0;
-void main() {
-  x += 1;
-}
-''');
-    var node = findNode.assignment('+=');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::num::@method::+
-''');
-  }
-
-  test_locate_BinaryExpression() async {
-    await resolveTestCode('var x = 3 + 4');
-    var node = findNode.binary('+');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::num::@method::+
-''');
-  }
-
-  test_locate_ClassDeclaration() async {
-    await resolveTestCode('class A {}');
-    var node = findNode.classDeclaration('class');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A
-''');
-  }
-
-  test_locate_CompilationUnit() async {
-    await resolveTestCode('// only comment');
-
-    var element = ElementLocator.locate(result.unit);
-    _assertElement(element, r'''
-<testLibraryFragment>
-''');
-  }
-
-  test_locate_ConstructorDeclaration_named() async {
-    await resolveTestCode(r'''
-class A {
-  A.foo();
-}
-''');
-    var node = findNode.constructor('A.foo()');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::foo
-''');
-  }
-
-  test_locate_ConstructorDeclaration_unnamed() async {
-    await resolveTestCode(r'''
-class A {
-  A();
-}
-''');
-    var node = findNode.constructor('A()');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::new
-''');
-  }
-
-  test_locate_ConstructorSelector_EnumConstantArguments_EnumConstantDeclaration() async {
-    await resolveTestCode(r'''
-enum E {
-  v.named(); // 0
-  const E.named();
-}
-''');
-    var node = findNode.constructorSelector('named(); // 0');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@enum::E::@constructor::named
-''');
-  }
-
-  test_locate_DeclaredVariablePattern() async {
-    await resolveTestCode(r'''
-void f(Object? x) {
-  if (x case int foo) {}
-}
-''');
-    var node = findNode.declaredVariablePattern('foo');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-foo@37
-''');
-  }
-
-  test_locate_EnumConstantDeclaration() async {
-    await resolveTestCode(r'''
-enum E {
-  one
-}
-''');
-    var node = findNode.enumConstantDeclaration('one');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@enum::E::@field::one
-''');
-  }
-
-  test_locate_ExportDirective() async {
-    await resolveTestCode("export 'dart:core';");
-    var node = findNode.export('export');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-LibraryExportElement
-  uri: DirectiveUriWithLibrary
-    uri: dart:core
-''');
-  }
-
-  test_locate_ExtensionDeclaration() async {
-    await resolveTestCode('extension A on int {}');
-    var node = findNode.singleExtensionDeclaration;
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@extension::A
-''');
-  }
-
-  test_locate_ExtensionTypeDeclaration() async {
-    await resolveTestCode('extension type A(int it) {}');
-    var node = findNode.singleExtensionTypeDeclaration;
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@extensionType::A
-''');
-  }
-
-  test_locate_FunctionDeclaration() async {
-    await resolveTestCode('int f() => 3;');
-    var node = findNode.functionDeclaration('f');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@function::f
-''');
-  }
-
-  test_locate_Identifier_annotationClass_namedConstructor() async {
-    await resolveTestCode(r'''
-class Class {
-  const Class.name();
-}
-void main(@Class.name() parameter) {}
-''');
-    var node = findNode.simple('Class.name() parameter');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::Class
-''');
-  }
-
-  test_locate_Identifier_annotationClass_unnamedConstructor() async {
-    await resolveTestCode(r'''
-class Class {
-  const Class();
-}
-void main(@Class() parameter) {}
-''');
-    var node = findNode.simple('Class() parameter');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::Class::@constructor::new
-''');
-  }
-
-  test_locate_Identifier_className() async {
-    await resolveTestCode('class A {}');
-    var node = findNode.classDeclaration('A');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A
-''');
-  }
-
-  test_locate_Identifier_constructor_named() async {
-    await resolveTestCode(r'''
-class A {
-  A.bar();
-}
-''');
-    var node = findNode.constructor('bar');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::bar
-''');
-  }
-
-  test_locate_Identifier_constructor_unnamed() async {
-    await resolveTestCode(r'''
-class A {
-  A();
-}
-''');
-    var node = findNode.simple('A()');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::new
-''');
-  }
-
-  test_locate_Identifier_fieldName() async {
-    await resolveTestCode('''
-class A {
-  var x;
-}
-''');
-    var node = findNode.variableDeclaration('x;');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@field::x
-''');
-  }
-
-  test_locate_Identifier_libraryDirective() async {
-    await resolveTestCode('library foo.bar;');
-    var node = findNode.simple('foo');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibrary>
-''');
-  }
-
-  test_locate_Identifier_propertyAccess() async {
-    await resolveTestCode(r'''
-void main() {
- int x = 'foo'.length;
-}
-''');
-    var node = findNode.simple('length');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::String::@getter::length
-''');
-  }
-
-  test_locate_ImportDirective() async {
-    await resolveTestCode("import 'dart:core';");
-    var node = findNode.import('import');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-LibraryImportElement
-  uri: DirectiveUriWithLibrary
-    uri: dart:core
-''');
-  }
-
-  test_locate_IndexExpression() async {
-    await resolveTestCode(r'''
-void main() {
-  var x = [1, 2];
-  var y = x[0];
-}
-''');
-    var node = findNode.index('[0]');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-MethodMember
-  base: dart:core::<fragment>::@class::List::@method::[]
-  substitution: {E: int}
-''');
-  }
-
-  test_locate_InstanceCreationExpression() async {
-    await resolveTestCode(r'''
-class A {}
-
-void main() {
- new A();
-}
-''');
-    var node = findNode.instanceCreation('new A()');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::new
-''');
-  }
-
-  test_locate_InstanceCreationExpression_type_prefixedIdentifier() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-class A {}
-''');
-    await resolveTestCode(r'''
-import 'a.dart' as pref;
-
-void main() {
- new pref.A();
-}
-''');
-    var node = findNode.instanceCreation('A();');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-package:test/a.dart::<fragment>::@class::A::@constructor::new
-''');
-  }
-
-  test_locate_InstanceCreationExpression_type_simpleIdentifier() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-''');
-    await resolveTestCode(r'''
-class A {}
-
-void main() {
- new A();
-}
-''');
-    var node = findNode.instanceCreation('A();');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@constructor::new
-''');
-  }
-
-  test_locate_LibraryDirective() async {
-    await resolveTestCode('library foo;');
-    var node = findNode.library('library');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibrary>
-''');
-  }
-
-  test_locate_MethodDeclaration() async {
-    await resolveTestCode(r'''
-class A {
-  void foo() {}
-}
-''');
-    var node = findNode.methodDeclaration('foo');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@method::foo
-''');
-  }
-
-  test_locate_MethodInvocation_method() async {
-    await resolveTestCode(r'''
-class A {
-  void foo() {}
-}
-
-void main() {
- new A().foo();
-}
-''');
-    var node = findNode.methodInvocation('foo();');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@class::A::@method::foo
-''');
-  }
-
-  test_locate_MethodInvocation_topLevel() async {
-    await resolveTestCode(r'''
-foo(x) {}
-
-void main() {
- foo(0);
-}
-''');
-    var node = findNode.methodInvocation('foo(0)');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@function::foo
-''');
-  }
-
-  test_locate_MixinDeclaration() async {
-    await resolveTestCode('mixin A {}');
-    var node = findNode.singleMixinDeclaration;
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@mixin::A
-''');
-  }
-
-  test_locate_PartOfDirective_withName() async {
-    var libFile = newFile('$testPackageLibPath/lib.dart', r'''
-library my.lib;
-part 'test.dart';
-''');
-
-    var partFile = newFile('$testPackageLibPath/test.dart', r'''
-part of my.lib;
-''');
-
-    await resolveFile(libFile);
-
-    await resolveFile2(partFile);
-    var node = findNode.partOf('part of');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-package:test/lib.dart
-''');
-  }
-
-  test_locate_PatternField() async {
-    await resolveTestCode(r'''
-void f(Object? x) {
-  if (x case int(isEven: true)) {}
-}
-''');
-    var node = findNode.patternField('isEven:');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::int::@getter::isEven
-''');
-  }
-
-  test_locate_PostfixExpression() async {
-    await resolveTestCode('int addOne(int x) => x++;');
-    var node = findNode.postfix('x++');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::num::@method::+
-''');
-  }
-
-  test_locate_Prefix() async {
-    await resolveTestCode(r'''
-import 'dart:math' as math;
-
-math.Random? r;
-''');
-    var node = findNode.importPrefixReference('math.Random');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@prefix::math
-''');
-  }
-
-  test_locate_PrefixedIdentifier() async {
-    await resolveTestCode(r'''
-void f(int a) {
-  a.isEven;
-}
-''');
-    var node = findNode.prefixed('a.isEven');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::int::@getter::isEven
-''');
-  }
-
-  test_locate_PrefixExpression() async {
-    await resolveTestCode('int addOne(int x) => ++x;');
-    var node = findNode.prefix('++x');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-dart:core::<fragment>::@class::num::@method::+
-''');
-  }
-
-  test_locate_RepresentationDeclaration() async {
-    await resolveTestCode('extension type A(int it) {}');
-    var node = findNode.singleRepresentationDeclaration;
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@extensionType::A::@field::it
-''');
-  }
-
-  test_locate_RepresentationDeclaration2() async {
-    await resolveTestCode('extension type A.named(int it) {}');
-    var node = findNode.singleRepresentationConstructorName;
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@extensionType::A::@constructor::named
-''');
-  }
-
-  test_locate_StringLiteral_exportUri() async {
-    newFile("$testPackageLibPath/foo.dart", '');
-    await resolveTestCode("export 'foo.dart';");
-    var node = findNode.stringLiteral('foo.dart');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-package:test/foo.dart
-''');
-  }
-
-  test_locate_StringLiteral_expression() async {
-    await resolveTestCode("var x = 'abc';");
-    var node = findNode.stringLiteral('abc');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<null>
-''');
-  }
-
-  test_locate_StringLiteral_importUri() async {
-    newFile("$testPackageLibPath/foo.dart", '');
-    await resolveTestCode("import 'foo.dart';");
-    var node = findNode.stringLiteral('foo.dart');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-package:test/foo.dart
-''');
-  }
-
-  test_locate_StringLiteral_partUri() async {
-    newFile("$testPackageLibPath/foo.dart", 'part of lib;');
-    await resolveTestCode('''
-library lib;
-
-part 'foo.dart';
-''');
-    var node = findNode.stringLiteral('foo.dart');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibrary>::@fragment::package:test/foo.dart
-''');
-  }
-
-  test_locate_VariableDeclaration() async {
-    await resolveTestCode('var x = 42;');
-    var node = findNode.variableDeclaration('x =');
-    var element = ElementLocator.locate(node);
-    _assertElement(element, r'''
-<testLibraryFragment>::@topLevelVariable::x
-''');
-  }
-
-  void _assertElement(Element? element, String expected) {
-    var buffer = StringBuffer();
-
-    var sink = TreeStringSink(
-      sink: buffer,
-      indent: '',
-    );
-
-    var elementPrinter = ElementPrinter(
-      sink: sink,
-      configuration: ElementPrinterConfiguration(),
-    );
-
-    elementPrinter.writeElement(element);
-
-    var actual = buffer.toString();
-    if (actual != expected) {
-      print('-------- Actual --------');
-      print('$actual------------------------');
-      NodeTextExpectationsCollector.add(actual);
-    }
-    expect(actual, expected);
-  }
-}
-
-@reflectiveTest
 class ElementLocatorTest2 extends PubPackageResolutionTest {
   test_locate_AssignedVariablePattern() async {
     await resolveTestCode(r'''
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index b8bbcbf..25a0d27 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:analyzer/src/test_utilities/find_element2.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:test/test.dart';
 
 import 'abstract_context.dart';
@@ -69,7 +70,17 @@
     if (node == null) {
       return null;
     }
-    return ElementLocator.locate(node);
+
+    switch (node) {
+      case ExportDirective():
+        return node.element;
+      case ImportDirective():
+        return node.element;
+      case PartOfDirective():
+        return node.element;
+      default:
+        return ElementLocator.locate2(node).asElement;
+    }
   }
 
   int findOffset(String search) {