Implement search for TypeAliasElement.
Change-Id: I14c931277432d95c8ed2ae48d5339a878966ddc5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/176402
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index d1f7aa3..b51c2cf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -66,12 +66,11 @@
}
ElementKind kind = element.kind;
- if (kind == ElementKind.CLASS ||
- kind == ElementKind.CONSTRUCTOR ||
- kind == ElementKind.ENUM ||
- kind == ElementKind.EXTENSION ||
- kind == ElementKind.FUNCTION_TYPE_ALIAS ||
- kind == ElementKind.SETTER) {
+ if (element is ClassElement ||
+ element is ConstructorElement ||
+ element is ExtensionElement ||
+ element is PropertyAccessorElement && element.isSetter ||
+ element is TypeAliasElement) {
return _searchReferences(element, searchedFiles);
} else if (kind == ElementKind.COMPILATION_UNIT) {
return _searchReferences_CompilationUnit(element);
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index a8e9aab..c91db90 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -15,6 +15,7 @@
defineReflectiveSuite(() {
defineReflectiveTests(SearchTest);
defineReflectiveTests(SearchWithNullSafetyTest);
+ defineReflectiveTests(SearchWithNonFunctionTypeAliasesTest);
});
}
@@ -1850,6 +1851,102 @@
}
@reflectiveTest
+class SearchWithNonFunctionTypeAliasesTest extends SearchTest
+ with WithNonFunctionTypeAliasesMixin {
+ test_searchReferences_ConstructorElement_named_viaTypeAlias() async {
+ await resolveTestCode('''
+class A<T> {
+ A.named();
+}
+
+typedef B = A<int>;
+
+void f() {
+ B.named(); // ref
+}
+''');
+
+ var element = findElement.constructor('named');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectIdQ(f, SearchResultKind.REFERENCE, '.named(); // ref',
+ length: '.named'.length),
+ ]);
+ }
+
+ test_searchReferences_TypeAliasElement() async {
+ await resolveTestCode('''
+class A<T> {
+ static int field = 0;
+ static void method() {}
+}
+
+typedef B = A<int>;
+
+class C extends B {} // extends
+
+void f(B p) {
+ B v;
+ B.field = 1;
+ B.field;
+ B.method();
+}
+''');
+
+ var element = findElement.typeAlias('B');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectId(findElement.class_('C'), SearchResultKind.REFERENCE,
+ 'B {} // extends'),
+ _expectId(findElement.parameter('p'), SearchResultKind.REFERENCE, 'B p'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B v'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.field ='),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.field;'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.method();'),
+ ]);
+ }
+
+ test_searchReferences_TypeAliasElement_fromLegacy() async {
+ newFile('$testPackageLibPath/a.dart', content: r'''
+typedef A<T> = Map<int, T>;
+''');
+ await resolveTestCode('''
+// @dart = 2.9
+import 'a.dart';
+
+void f(A<String> a) {}
+''');
+
+ var A = findElement.importFind('package:test/a.dart').typeAlias('A');
+ await _verifyReferences(A, [
+ _expectId(
+ findElement.parameter('a'),
+ SearchResultKind.REFERENCE,
+ 'A<String>',
+ ),
+ ]);
+ }
+
+ test_searchReferences_TypeAliasElement_inConstructorName() async {
+ await resolveTestCode('''
+class A<T> {}
+
+typedef B = A<int>;
+
+void f() {
+ B();
+}
+''');
+
+ var element = findElement.typeAlias('B');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectId(f, SearchResultKind.REFERENCE, 'B();'),
+ ]);
+ }
+}
+
+@reflectiveTest
class SearchWithNullSafetyTest extends SearchTest with WithNullSafetyMixin {
test_searchReferences_ImportElement_noPrefix_optIn_fromOptOut() async {
newFile('$testPackageLibPath/a.dart', content: r'''