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) {