Skip to content

Commit 0c15648

Browse files
bwilkersonCommit Queue
authored andcommitted
[migration] search_find_element_references.dart
Change-Id: I320e4a92a8c5b5e6cb55347d93272c38a92cc325 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410100 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent ce5de54 commit 0c15648

File tree

4 files changed

+51
-42
lines changed

4 files changed

+51
-42
lines changed

pkg/analysis_server/lib/src/analysis_server.dart

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -646,10 +646,10 @@ abstract class AnalysisServer {
646646
/// Gets the current version number of a document (if known).
647647
int? getDocumentVersion(String path);
648648

649-
/// Return a [Future] that completes with the [Element] at the given
649+
/// Return a [Future] that completes with the [Element2] at the given
650650
/// [offset] of the given [file], or with `null` if there is no node at the
651651
/// [offset] or the node does not have an element.
652-
Future<Element?> getElementAtOffset(String file, int offset) async {
652+
Future<Element2?> getElementAtOffset2(String file, int offset) async {
653653
if (!priorityFiles.contains(file)) {
654654
var driver = getAnalysisDriver(file);
655655
if (driver == null) {
@@ -661,22 +661,19 @@ abstract class AnalysisServer {
661661
return null;
662662
}
663663

664-
var element = findElementByNameOffset(unitElementResult.element, offset);
665-
if (element != null) {
666-
return element;
664+
var fragment = findFragmentByNameOffset(
665+
unitElementResult.fragment,
666+
offset,
667+
);
668+
if (fragment != null) {
669+
return fragment.element;
667670
}
668671
}
669672

670673
var node = await getNodeAtOffset(file, offset);
671-
return getElementOfNode(node);
674+
return getElementOfNode2(node);
672675
}
673676

674-
/// Return a [Future] that completes with the [Element2] at the given
675-
/// [offset] of the given [file], or with `null` if there is no node at the
676-
/// [offset] or the node does not have an element.
677-
Future<Element2?> getElementAtOffset2(String file, int offset) async =>
678-
(await getElementAtOffset(file, offset)).asElement2;
679-
680677
/// Return the [Element] of the given [node], or `null` if [node] is `null` or
681678
/// does not have an element.
682679
Element? getElementOfNode(AstNode? node) {

pkg/analysis_server/lib/src/handler/legacy/search_find_element_references.dart

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'dart:async';
86

97
import 'package:analysis_server/plugin/protocol/protocol_dart.dart' as protocol;
108
import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
119
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
1210
import 'package:analysis_server/src/protocol_server.dart';
1311
import 'package:analysis_server/src/search/element_references.dart';
14-
import 'package:analyzer/dart/element/element.dart';
15-
import 'package:analyzer/src/utilities/extensions/element.dart';
12+
import 'package:analyzer/dart/element/element2.dart';
1613

1714
/// The handler for the `search.findElementReferences` request.
1815
class SearchFindElementReferencesHandler extends LegacyHandler {
@@ -34,31 +31,25 @@ class SearchFindElementReferencesHandler extends LegacyHandler {
3431
);
3532
var file = params.file;
3633
// prepare element
37-
var element = await server.getElementAtOffset(file, params.offset);
38-
if (element is LibraryImportElement) {
39-
element = element.prefix?.element;
40-
}
41-
if (element is FieldFormalParameterElement) {
42-
element = element.field;
34+
var element = await server.getElementAtOffset2(file, params.offset);
35+
if (element is FieldFormalParameterElement2) {
36+
element = element.field2;
4337
}
44-
if (element is PropertyAccessorElement) {
45-
element = element.variable2;
38+
if (element is PropertyAccessorElement2) {
39+
element = element.variable3;
4640
}
4741
// respond
4842
var searchId = (server.nextSearchId++).toString();
4943
var result = protocol.SearchFindElementReferencesResult();
5044
if (element != null) {
5145
result.id = searchId;
52-
result.element = protocol.convertElement(element.asElement2!);
46+
result.element = protocol.convertElement(element);
5347
}
5448
sendResult(result);
5549
// search elements
5650
if (element != null) {
5751
var computer = ElementReferencesComputer(searchEngine);
58-
var results = await computer.compute(
59-
element.asElement2!,
60-
params.includePotential,
61-
);
52+
var results = await computer.compute(element, params.includePotential);
6253
sendSearchResults(
6354
protocol.SearchResultsParams(
6455
searchId,

pkg/analysis_server/lib/src/services/search/element_visitors.dart

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/dart/element/element2.dart';
99
import 'package:analyzer/dart/element/visitor.dart';
1010
import 'package:analyzer/dart/element/visitor2.dart';
11-
import 'package:analyzer/src/utilities/extensions/element.dart';
1211

1312
/// Return the [Element] that is either [root], or one of its direct or
1413
/// indirect children, and has the given [nameOffset].
@@ -25,10 +24,11 @@ Element? findElementByNameOffset(Element? root, int nameOffset) {
2524
return null;
2625
}
2726

28-
/// Return the [Element2] that is either [root], or one of its direct or
27+
/// Returns the fragment that is either [fragment], or one of its direct or
2928
/// indirect children, and has the given [nameOffset].
30-
Element2? findElementByNameOffset2(Element2? root, int nameOffset) =>
31-
findElementByNameOffset(root.asElement, nameOffset).asElement2;
29+
Fragment? findFragmentByNameOffset(LibraryFragment fragment, int nameOffset) {
30+
return _FragmentByNameOffsetVisitor(nameOffset).search(fragment);
31+
}
3232

3333
/// Uses [processor] to visit all of the children of [element].
3434
/// If [processor] returns `true`, then children of a child are visited too.
@@ -108,6 +108,28 @@ class _ElementVisitorAdapter2 extends GeneralizingElementVisitor2<void> {
108108
}
109109
}
110110

111+
/// A visitor that finds the deep-most fragment that contains the [nameOffset].
112+
class _FragmentByNameOffsetVisitor {
113+
final int nameOffset;
114+
115+
_FragmentByNameOffsetVisitor(this.nameOffset);
116+
117+
Fragment? search(LibraryFragment fragment) => _searchIn(fragment);
118+
119+
Fragment? _searchIn(Fragment fragment) {
120+
if (fragment.nameOffset2 == nameOffset) {
121+
return fragment;
122+
}
123+
for (var child in fragment.children3) {
124+
var result = _searchIn(child);
125+
if (result != null) {
126+
return result;
127+
}
128+
}
129+
return null;
130+
}
131+
}
132+
111133
/// A [GeneralizingElementVisitor] for visiting top-level elements.
112134
class _TopLevelElementsVisitor extends GeneralizingElementVisitor<void> {
113135
final VoidElementProcessor processor;

pkg/analysis_server/test/services/search/element_visitors_test.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void main() {
1717

1818
@reflectiveTest
1919
class FindElementByNameOffsetTest extends AbstractSingleUnitTest {
20-
Element2 get testUnitElement => testLibraryElement;
20+
LibraryFragment get testUnitFragment => testUnit.declaredFragment!;
2121

2222
Future<void> test_class() async {
2323
await resolveTestCode(r'''
@@ -42,13 +42,12 @@ void bbb() {}
4242
class AAA {}
4343
class BBB {}
4444
''');
45-
expect(findElementByNameOffset2(null, 0), isNull);
4645

47-
expect(findElementByNameOffset2(testUnitElement, 0), isNull);
48-
expect(findElementByNameOffset2(testUnitElement, 1), isNull);
46+
expect(findFragmentByNameOffset(testUnitFragment, 0), isNull);
47+
expect(findFragmentByNameOffset(testUnitFragment, 1), isNull);
4948

50-
expect(findElementByNameOffset2(testUnitElement, 5), isNull);
51-
expect(findElementByNameOffset2(testUnitElement, 7), isNull);
49+
expect(findFragmentByNameOffset(testUnitFragment, 5), isNull);
50+
expect(findFragmentByNameOffset(testUnitFragment, 7), isNull);
5251
}
5352

5453
Future<void> test_topLevelVariable() async {
@@ -62,8 +61,8 @@ int? ccc;
6261
}
6362

6463
void _assertElement(int nameOffset, ElementKind kind, String name) {
65-
var element = findElementByNameOffset2(testUnitElement, nameOffset)!;
66-
expect(element.kind, kind);
67-
expect(element.name3, name);
64+
var fragment = findFragmentByNameOffset(testUnitFragment, nameOffset)!;
65+
expect(fragment.element.kind, kind);
66+
expect(fragment.name2, name);
6867
}
6968
}

0 commit comments

Comments
 (0)