Skip to content

Commit 843c47b

Browse files
bwilkersonCommit Queue
authored andcommitted
Migrate more tests in analysis_server
Change-Id: I14885a2b5ea4fd89b14ae52124d800a2b24ccad0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/395401 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 6b7defd commit 843c47b

File tree

9 files changed

+408
-218
lines changed

9 files changed

+408
-218
lines changed

pkg/analysis_server/analyzer_use_new_elements.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ test/abstract_single_unit.dart
9595
test/plugin/protocol_dart_test.dart
9696
test/services/correction/name_suggestion_test.dart
9797
test/services/correction/status_test.dart
98-
test/services/refactoring/agnostic/change_method_signature_test.dart
9998
test/services/refactoring/legacy/abstract_rename.dart
10099
test/services/refactoring/legacy/convert_getter_to_method_test.dart
101100
test/services/refactoring/legacy/convert_method_to_getter_test.dart
@@ -105,5 +104,3 @@ test/services/refactoring/legacy/rename_constructor_test.dart
105104
test/services/refactoring/legacy/rename_import_test.dart
106105
test/services/refactoring/legacy/rename_library_test.dart
107106
test/services/search/element_visitors_test.dart
108-
test/services/search/hierarchy_test.dart
109-
test/services/search/search_engine_test.dart

pkg/analysis_server/lib/src/services/correction/namespace.dart

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ LibraryImportElement? getImportElement(SimpleIdentifier prefixNode) {
3737
return _getImportElementInfo(prefixNode);
3838
}
3939

40+
/// Return the [LibraryImport] that is referenced by [prefixNode], or
41+
/// `null` if the node does not reference a prefix or if we cannot determine
42+
/// which import is being referenced.
43+
LibraryImport? getImportElement2(SimpleIdentifier prefixNode) {
44+
var parent = prefixNode.parent;
45+
if (parent is ImportDirective) {
46+
return parent.libraryImport;
47+
}
48+
return _getImportElementInfo2(prefixNode);
49+
}
50+
4051
/// Returns the export namespace of the given [LibraryElement].
4152
Map<String, Element> _getExportNamespaceForLibrary(LibraryElement library) {
4253
var namespace = NamespaceBuilder().createExportNamespaceForLibrary(library);
@@ -112,6 +123,74 @@ LibraryImportElement? _getImportElement(
112123
return null;
113124
}
114125

126+
/// Return the [LibraryImportElement] that declared [prefix] and imports [element].
127+
///
128+
/// [libraryElement] - the [LibraryElement] where reference is.
129+
/// [prefix] - the import prefix, maybe `null`.
130+
/// [element] - the referenced element.
131+
LibraryImport? _getImportElement2(
132+
LibraryElement2 libraryElement,
133+
String prefix,
134+
Element2 element,
135+
) {
136+
if (element.enclosingElement2 is! LibraryElement2) {
137+
return null;
138+
}
139+
var usedLibrary = element.library2;
140+
// find ImportElement that imports used library with used prefix
141+
List<LibraryImport>? candidates;
142+
for (var libraryImport in libraryElement.firstFragment.libraryImports2) {
143+
// required library
144+
if (libraryImport.importedLibrary2 != usedLibrary) {
145+
continue;
146+
}
147+
// required prefix
148+
var prefixElement = libraryImport.prefix2?.element;
149+
if (prefixElement == null) {
150+
continue;
151+
}
152+
if (prefix != prefixElement.name3) {
153+
continue;
154+
}
155+
// no combinators => only possible candidate
156+
if (libraryImport.combinators.isEmpty) {
157+
return libraryImport;
158+
}
159+
// OK, we have candidate
160+
candidates ??= [];
161+
candidates.add(libraryImport);
162+
}
163+
// no candidates, probably element is defined in this library
164+
if (candidates == null) {
165+
return null;
166+
}
167+
// one candidate
168+
if (candidates.length == 1) {
169+
return candidates[0];
170+
}
171+
172+
var importElementsMap = <LibraryImport, Set<Element2>>{};
173+
// ensure that each ImportElement has set of elements
174+
for (var importElement in candidates) {
175+
if (importElementsMap.containsKey(importElement)) {
176+
continue;
177+
}
178+
var namespace = importElement.namespace;
179+
var elements = namespace.definedNames2.values.toSet();
180+
importElementsMap[importElement] = elements;
181+
}
182+
// use import namespace to choose correct one
183+
for (var entry in importElementsMap.entries) {
184+
var importElement = entry.key;
185+
var elements = entry.value;
186+
if (elements.contains(element)) {
187+
return importElement;
188+
}
189+
}
190+
// not found
191+
return null;
192+
}
193+
115194
/// Returns the [LibraryImportElement] that is referenced by [prefixNode] with a
116195
/// [PrefixElement], maybe `null`.
117196
LibraryImportElement? _getImportElementInfo(SimpleIdentifier prefixNode) {
@@ -143,3 +222,35 @@ LibraryImportElement? _getImportElementInfo(SimpleIdentifier prefixNode) {
143222
var prefix = prefixNode.name;
144223
return _getImportElement(libraryElement, prefix, usedElement);
145224
}
225+
226+
/// Returns the [LibraryImport2] that is referenced by [prefixNode] with a
227+
/// [PrefixElement], maybe `null`.
228+
LibraryImport? _getImportElementInfo2(SimpleIdentifier prefixNode) {
229+
// prepare environment
230+
var parent = prefixNode.parent;
231+
var unit = prefixNode.thisOrAncestorOfType<CompilationUnit>();
232+
var libraryElement = unit?.declaredFragment?.element;
233+
if (libraryElement == null) {
234+
return null;
235+
}
236+
// prepare used element
237+
Element2? usedElement;
238+
if (parent is PrefixedIdentifier) {
239+
var prefixed = parent;
240+
if (prefixed.prefix == prefixNode) {
241+
usedElement = prefixed.element;
242+
}
243+
} else if (parent is MethodInvocation) {
244+
var invocation = parent;
245+
if (invocation.target == prefixNode) {
246+
usedElement = invocation.methodName.element;
247+
}
248+
}
249+
// we need used Element
250+
if (usedElement == null) {
251+
return null;
252+
}
253+
// find ImportElement
254+
var prefix = prefixNode.name;
255+
return _getImportElement2(libraryElement, prefix, usedElement);
256+
}

pkg/analysis_server/lib/src/services/refactoring/agnostic/change_method_signature.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import 'package:analyzer/dart/analysis/results.dart';
1616
import 'package:analyzer/dart/ast/ast.dart';
1717
import 'package:analyzer/dart/ast/token.dart';
1818
import 'package:analyzer/dart/element/element.dart';
19+
import 'package:analyzer/dart/element/element2.dart';
1920
import 'package:analyzer/src/dart/analysis/session_helper.dart';
2021
import 'package:analyzer/src/dart/ast/extensions.dart';
2122
import 'package:analyzer/src/utilities/extensions/collection.dart';
23+
import 'package:analyzer/src/utilities/extensions/element.dart';
2224
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
2325
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
2426
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -252,6 +254,10 @@ final class ValidSelectionState extends SelectionState {
252254
required this.element,
253255
required this.formalParameters,
254256
});
257+
258+
/// The element of the target method, used to find corresponding methods
259+
/// in the class hierarchy.
260+
ExecutableElement2 get element2 => element.asElement2;
255261
}
256262

257263
class _AvailabilityAnalyzer {

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analysis_server/src/services/search/search_engine.dart';
99
import 'package:analyzer/dart/element/element.dart';
1010
import 'package:analyzer/dart/element/element2.dart';
1111
import 'package:analyzer/src/util/performance/operation_performance.dart';
12+
import 'package:analyzer/src/utilities/extensions/element.dart';
1213

1314
/// Returns direct children of [parent].
1415
List<Element> getChildren(Element parent, [String? name]) {
@@ -167,6 +168,25 @@ Future<Set<ClassMemberElement>> getHierarchyMembers(
167168
return members;
168169
}
169170

171+
/// Return all implementations of the given [member], including in its
172+
/// superclasses and their subclasses.
173+
///
174+
/// If [includeParametersForFields] is true and [member] is a [FieldElement],
175+
/// any [FieldFormalParameterElement]s for the member will also be provided
176+
/// (otherwise, the parameter set will be empty in the result).
177+
Future<Set<Element2>> getHierarchyMembers2(
178+
SearchEngine searchEngine,
179+
Element2 member, {
180+
OperationPerformanceImpl? performance,
181+
}) async {
182+
var result = await getHierarchyMembers(
183+
searchEngine,
184+
member.asElement as ClassMemberElement,
185+
performance: performance,
186+
);
187+
return result.map((e) => e.asElement2!).toSet();
188+
}
189+
170190
/// Return all implementations of the given [member], including in its
171191
/// superclasses and their subclasses.
172192
///
@@ -276,6 +296,19 @@ Future<List<ParameterElement>> getHierarchyNamedParameters(
276296
return [element];
277297
}
278298

299+
/// If the [element] is a named parameter in a [MethodElement], return all
300+
/// corresponding named parameters in the method hierarchy.
301+
Future<List<FormalParameterElement>> getHierarchyNamedParameters2(
302+
SearchEngine searchEngine,
303+
FormalParameterElement element,
304+
) async {
305+
var result = await getHierarchyNamedParameters(
306+
searchEngine,
307+
element.asElement as ParameterElement,
308+
);
309+
return result.map((e) => e.asElement2 as FormalParameterElement).toList();
310+
}
311+
279312
/// Returns non-synthetic members of the given [InterfaceElement] and its super
280313
/// classes.
281314
///

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/dart/element/element2.dart';
67
import 'package:analyzer/source/source.dart';
78
import 'package:analyzer/source/source_range.dart';
89
import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -147,6 +148,9 @@ abstract class SearchMatch {
147148
/// Return the [Element] containing the match.
148149
Element get element;
149150

151+
/// Return the element containing the match.
152+
Element2 get element2;
153+
150154
/// The absolute path of the file containing the match.
151155
String get file;
152156

@@ -162,6 +166,9 @@ abstract class SearchMatch {
162166
/// Return the [LibraryElement] for the [file].
163167
LibraryElement get libraryElement;
164168

169+
/// Return the library element for the [file].
170+
LibraryElement2 get libraryElement2;
171+
165172
/// The library [Source] of the reference.
166173
Source get librarySource;
167174

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
import 'package:analysis_server/src/services/search/search_engine.dart';
66
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
78
import 'package:analyzer/source/source.dart';
89
import 'package:analyzer/source/source_range.dart';
910
import 'package:analyzer/src/dart/analysis/driver.dart';
1011
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
1112
import 'package:analyzer/src/dart/analysis/search.dart';
1213
import 'package:analyzer/src/dart/element/element.dart';
1314
import 'package:analyzer/src/util/performance/operation_performance.dart';
15+
import 'package:analyzer/src/utilities/extensions/element.dart';
1416

1517
/// A [SearchEngine] implementation.
1618
class SearchEngineImpl implements SearchEngine {
@@ -43,6 +45,16 @@ class SearchEngineImpl implements SearchEngine {
4345
await addSubtypes(type);
4446
}
4547

48+
Future<void> appendAllSubtypes2(
49+
InterfaceElement2 type,
50+
Set<InterfaceElement2> allSubtypes,
51+
OperationPerformanceImpl performance,
52+
) async {
53+
var subtypes = <InterfaceElement>{};
54+
await appendAllSubtypes(type.asElement, subtypes, performance);
55+
allSubtypes.addAll(subtypes.map((e) => e.asElement2));
56+
}
57+
4658
@override
4759
Future<Set<String>?> membersOfSubtypes(InterfaceElement type) async {
4860
var drivers = _drivers.toList();
@@ -86,6 +98,10 @@ class SearchEngineImpl implements SearchEngine {
8698
return members;
8799
}
88100

101+
Future<Set<String>?> membersOfSubtypes2(InterfaceElement2 type) async {
102+
return await membersOfSubtypes(type.asElement);
103+
}
104+
89105
@override
90106
Future<List<SearchMatch>> searchMemberDeclarations(String name) async {
91107
var allDeclarations = <SearchMatch>[];
@@ -135,6 +151,10 @@ class SearchEngineImpl implements SearchEngine {
135151
return allResults.map(SearchMatchImpl.forSearchResult).toList();
136152
}
137153

154+
Future<List<SearchMatch>> searchReferences2(Element2 element) async {
155+
return await searchReferences(element.asElement!);
156+
}
157+
138158
@override
139159
Future<List<SearchMatch>> searchSubtypes(
140160
InterfaceElement type,
@@ -255,6 +275,13 @@ class SearchMatchImpl implements SearchMatch {
255275
this.sourceRange,
256276
);
257277

278+
@override
279+
Element2 get element2 => element.asElement2!;
280+
281+
@override
282+
LibraryElement2 get libraryElement2 =>
283+
libraryElement.asElement2 as LibraryElement2;
284+
258285
@override
259286
String toString() {
260287
var buffer = StringBuffer();

0 commit comments

Comments
 (0)