Skip to content

Commit 1cca342

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Migrate lib/src/search/type_hierarchy.dart
Change-Id: Ic5ef83f214167da062f7dc1326361527235262bb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/399030 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 8aa8608 commit 1cca342

File tree

6 files changed

+100
-69
lines changed

6 files changed

+100
-69
lines changed

pkg/analysis_server/analyzer_use_new_elements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ lib/src/lsp/handlers/handler_rename.dart
2121
lib/src/operation/operation_analysis.dart
2222
lib/src/protocol_server.dart
2323
lib/src/search/element_references.dart
24-
lib/src/search/type_hierarchy.dart
2524
lib/src/services/correction/namespace.dart
2625
lib/src/services/kythe/kythe_visitors.dart
2726
lib/src/services/refactoring/agnostic/change_method_signature.dart

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analysis_server/protocol/protocol.dart' as protocol;
88
import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
99
import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
1010
import 'package:analysis_server/src/search/type_hierarchy.dart';
11+
import 'package:analyzer/src/utilities/extensions/element.dart';
1112

1213
/// The handler for the `search.getTypeHierarchy` request.
1314
class SearchGetTypeHierarchyHandler extends LegacyHandler {
@@ -36,7 +37,7 @@ class SearchGetTypeHierarchyHandler extends LegacyHandler {
3637
}
3738
// maybe supertype hierarchy only
3839
if (params.superOnly == true) {
39-
var computer = TypeHierarchyComputer(searchEngine, element);
40+
var computer = TypeHierarchyComputer(searchEngine, element.asElement2!);
4041
var items = computer.computeSuper();
4142
var response = protocol.SearchGetTypeHierarchyResult(
4243
hierarchyItems: items,
@@ -45,7 +46,7 @@ class SearchGetTypeHierarchyHandler extends LegacyHandler {
4546
return;
4647
}
4748
// prepare type hierarchy
48-
var computer = TypeHierarchyComputer(searchEngine, element);
49+
var computer = TypeHierarchyComputer(searchEngine, element.asElement2!);
4950
var items = await computer.compute();
5051
var response = protocol.SearchGetTypeHierarchyResult(
5152
hierarchyItems: items,

pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:analyzer/dart/analysis/results.dart';
1313
import 'package:analyzer/dart/element/element.dart';
1414
import 'package:analyzer/src/dart/ast/utilities.dart';
1515
import 'package:analyzer/src/util/performance/operation_performance.dart';
16+
import 'package:analyzer/src/utilities/extensions/element.dart';
1617

1718
typedef StaticOptions =
1819
Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>;
@@ -68,7 +69,7 @@ class ImplementationHandler
6869
return success([]);
6970
}
7071

71-
var helper = TypeHierarchyComputerHelper.fromElement(element);
72+
var helper = TypeHierarchyComputerHelper.fromElement(element.asElement2!);
7273
var interfaceElement = helper.pivotClass;
7374
if (interfaceElement == null) {
7475
return success([]);
@@ -79,7 +80,7 @@ class ImplementationHandler
7980
await performance.runAsync(
8081
'appendAllSubtypes',
8182
(performance) => server.searchEngine.appendAllSubtypes(
82-
interfaceElement,
83+
interfaceElement.asElement,
8384
allSubtypes,
8485
performance,
8586
),
@@ -94,23 +95,32 @@ class ImplementationHandler
9495
// Filter based on type, so when searching for members we don't
9596
// include any intermediate classes that don't have
9697
// implementations for the method.
97-
? helper.findMemberElement(element)?.nonSynthetic
98-
: element;
98+
? helper.findMemberElement(element.asElement2)?.nonSynthetic2
99+
: element.asElement2;
99100
})
100101
.nonNulls
101102
.toSet()
102103
.map((element) {
103-
var unitElement =
104-
element.thisOrAncestorOfType<CompilationUnitElement>();
105-
if (unitElement == null) {
104+
var firstFragment = element.firstFragment;
105+
var libraryFragment = firstFragment.libraryFragment;
106+
if (libraryFragment == null) {
106107
return null;
107108
}
109+
110+
var nameOffset = firstFragment.nameOffset2;
111+
var name = firstFragment.name2;
112+
if (nameOffset == null || name == null) {
113+
return null;
114+
}
115+
108116
return Location(
109-
uri: uriConverter.toClientUri(unitElement.source.fullName),
117+
uri: uriConverter.toClientUri(
118+
libraryFragment.source.fullName,
119+
),
110120
range: toRange(
111-
unitElement.lineInfo,
112-
element.nameOffset,
113-
element.nameLength,
121+
libraryFragment.lineInfo,
122+
nameOffset,
123+
name.length,
114124
),
115125
);
116126
})

pkg/analysis_server/lib/src/search/type_hierarchy.dart

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,23 @@
55
import 'dart:collection';
66

77
import 'package:analysis_server/src/protocol_server.dart'
8-
show TypeHierarchyItem, convertElement;
8+
show TypeHierarchyItem, convertElement2;
99
import 'package:analysis_server/src/services/search/hierarchy.dart';
1010
import 'package:analysis_server/src/services/search/search_engine.dart';
11-
import 'package:analyzer/dart/element/element.dart';
11+
import 'package:analyzer/dart/element/element2.dart';
1212
import 'package:analyzer/dart/element/type.dart';
13-
import 'package:analyzer/src/utilities/extensions/element.dart';
1413

15-
/// A computer for a type hierarchy of an [Element].
14+
/// A computer for a type hierarchy of an [Element2].
1615
class TypeHierarchyComputer {
1716
final SearchEngine _searchEngine;
1817
final TypeHierarchyComputerHelper helper;
1918

2019
final List<TypeHierarchyItem> _items = <TypeHierarchyItem>[];
21-
final List<InterfaceElement> _itemClassElements = [];
22-
final Map<Element, TypeHierarchyItem> _elementItemMap =
23-
HashMap<Element, TypeHierarchyItem>();
20+
final List<InterfaceElement2> _itemClassElements = [];
21+
final Map<Element2, TypeHierarchyItem> _elementItemMap =
22+
HashMap<Element2, TypeHierarchyItem>();
2423

25-
TypeHierarchyComputer(this._searchEngine, Element pivotElement)
24+
TypeHierarchyComputer(this._searchEngine, Element2 pivotElement)
2625
: helper = TypeHierarchyComputerHelper.fromElement(pivotElement);
2726

2827
/// Returns the computed type hierarchy, maybe `null`.
@@ -50,39 +49,39 @@ class TypeHierarchyComputer {
5049
Future<void> _createSubclasses(
5150
TypeHierarchyItem item,
5251
int itemId,
53-
InterfaceElement classElement,
52+
InterfaceElement2 classElement,
5453
SearchEngineCache searchEngineCache,
5554
) async {
5655
var subElements = await getDirectSubClasses(
5756
_searchEngine,
58-
classElement.asElement2,
57+
classElement,
5958
searchEngineCache,
6059
);
6160
var subItemIds = <int>[];
6261
for (var subElement in subElements) {
6362
// check for recursion
64-
var subItem = _elementItemMap[subElement.asElement];
63+
var subItem = _elementItemMap[subElement];
6564
if (subItem != null) {
6665
var id = _items.indexOf(subItem);
6766
item.subclasses.add(id);
6867
continue;
6968
}
7069
// create a subclass item
71-
var subMemberElement = helper.findMemberElement(subElement.asElement);
72-
var subMemberElementDeclared = subMemberElement?.nonSynthetic;
70+
var subMemberElement = helper.findMemberElement(subElement);
71+
var subMemberElementDeclared = subMemberElement?.nonSynthetic2;
7372
subItem = TypeHierarchyItem(
74-
convertElement(subElement.asElement),
73+
convertElement2(subElement),
7574
memberElement:
7675
subMemberElementDeclared != null
77-
? convertElement(subMemberElementDeclared)
76+
? convertElement2(subMemberElementDeclared)
7877
: null,
7978
superclass: itemId,
8079
);
8180
var subItemId = _items.length;
8281
// remember
83-
_elementItemMap[subElement.asElement] = subItem;
82+
_elementItemMap[subElement] = subItem;
8483
_items.add(subItem);
85-
_itemClassElements.add(subElement.asElement);
84+
_itemClassElements.add(subElement);
8685
// add to hierarchy
8786
item.subclasses.add(subItemId);
8887
subItemIds.add(subItemId);
@@ -101,7 +100,7 @@ class TypeHierarchyComputer {
101100
}
102101

103102
int _createSuperItem(
104-
InterfaceElement classElement,
103+
InterfaceElement2 classElement,
105104
List<DartType>? typeArguments,
106105
) {
107106
// check for recursion
@@ -121,13 +120,13 @@ class TypeHierarchyComputer {
121120
displayName = '${classElement.displayName}<$typeArgumentsStr>';
122121
}
123122
var memberElement = helper.findMemberElement(classElement);
124-
var memberElementDeclared = memberElement?.nonSynthetic;
123+
var memberElementDeclared = memberElement?.nonSynthetic2;
125124
item = TypeHierarchyItem(
126-
convertElement(classElement),
125+
convertElement2(classElement),
127126
displayName: displayName,
128127
memberElement:
129128
memberElementDeclared != null
130-
? convertElement(memberElementDeclared)
129+
? convertElement2(memberElementDeclared)
131130
: null,
132131
);
133132
_elementItemMap[classElement] = item;
@@ -140,19 +139,19 @@ class TypeHierarchyComputer {
140139
var superType = classElement.supertype;
141140
if (superType != null) {
142141
item.superclass = _createSuperItem(
143-
superType.element,
142+
superType.element3,
144143
superType.typeArguments,
145144
);
146145
}
147146
}
148147
// mixins
149148
for (var type in classElement.mixins) {
150-
var id = _createSuperItem(type.element, type.typeArguments);
149+
var id = _createSuperItem(type.element3, type.typeArguments);
151150
item.mixins.add(id);
152151
}
153152
// interfaces
154153
for (var type in classElement.interfaces) {
155-
var id = _createSuperItem(type.element, type.typeArguments);
154+
var id = _createSuperItem(type.element3, type.typeArguments);
156155
item.interfaces.add(id);
157156
}
158157
// done
@@ -161,12 +160,12 @@ class TypeHierarchyComputer {
161160
}
162161

163162
class TypeHierarchyComputerHelper {
164-
final Element pivotElement;
165-
final LibraryElement pivotLibrary;
163+
final Element2 pivotElement;
164+
final LibraryElement2 pivotLibrary;
166165
final ElementKind pivotKind;
167166
final String? pivotName;
168167
final bool pivotFieldFinal;
169-
final InterfaceElement? pivotClass;
168+
final InterfaceElement2? pivotClass;
170169

171170
TypeHierarchyComputerHelper(
172171
this.pivotElement,
@@ -177,85 +176,85 @@ class TypeHierarchyComputerHelper {
177176
this.pivotClass,
178177
);
179178

180-
factory TypeHierarchyComputerHelper.fromElement(Element pivotElement) {
179+
factory TypeHierarchyComputerHelper.fromElement(Element2 pivotElement) {
181180
// try to find enclosing ClassElement
182-
Element? element = pivotElement;
181+
Element2? element = pivotElement;
183182
bool pivotFieldFinal = false;
184-
if (pivotElement is FieldElement) {
183+
if (pivotElement is FieldElement2) {
185184
pivotFieldFinal = pivotElement.isFinal;
186-
element = pivotElement.enclosingElement3;
185+
element = pivotElement.enclosingElement2;
187186
}
188-
if (pivotElement is ExecutableElement) {
189-
element = pivotElement.enclosingElement3;
187+
if (pivotElement is ExecutableElement2) {
188+
element = pivotElement.enclosingElement2;
190189
}
191-
InterfaceElement? pivotClass;
192-
if (element is InterfaceElement) {
190+
InterfaceElement2? pivotClass;
191+
if (element is InterfaceElement2) {
193192
pivotClass = element;
194193
}
195194

196195
return TypeHierarchyComputerHelper(
197196
pivotElement,
198-
pivotElement.library!,
197+
pivotElement.library2!,
199198
pivotElement.kind,
200-
pivotElement.name,
199+
pivotElement.name3,
201200
pivotFieldFinal,
202201
pivotClass,
203202
);
204203
}
205204

206-
ExecutableElement? findMemberElement(InterfaceElement clazz) {
205+
ExecutableElement2? findMemberElement(InterfaceElement2 clazz) {
207206
// Members of extension types don't override anything.
208207
// They redeclare, and resolved statically.
209-
if (pivotClass is ExtensionTypeElement || clazz is ExtensionTypeElement) {
208+
if (pivotClass is ExtensionTypeElement2 || clazz is ExtensionTypeElement2) {
210209
return null;
211210
}
212211

213212
var pivotName = this.pivotName;
214213
if (pivotName == null) {
215214
return null;
216215
}
217-
ExecutableElement? result;
216+
ExecutableElement2? result;
218217
// try to find in the class itself
219218
if (pivotKind == ElementKind.METHOD) {
220-
result = clazz.getMethod(pivotName);
219+
result = clazz.getMethod2(pivotName);
221220
} else if (pivotKind == ElementKind.GETTER) {
222-
result = clazz.getGetter(pivotName);
221+
result = clazz.getGetter2(pivotName);
223222
} else if (pivotKind == ElementKind.SETTER) {
224-
result = clazz.getSetter(pivotName);
223+
result = clazz.getSetter2(pivotName);
225224
} else if (pivotKind == ElementKind.FIELD) {
226-
result = clazz.getGetter(pivotName);
225+
result = clazz.getGetter2(pivotName);
227226
if (result == null && !pivotFieldFinal) {
228-
result = clazz.getSetter(pivotName);
227+
result = clazz.getSetter2(pivotName);
229228
}
230229
}
231-
if (result != null && result.isAccessibleIn(pivotLibrary)) {
230+
if (result != null && result.isAccessibleIn2(pivotLibrary)) {
232231
return result;
233232
}
234233
// try to find in the class mixin
235234
for (var mixin in clazz.mixins.reversed) {
236-
var mixinElement = mixin.element;
235+
var mixinElement = mixin.element3;
237236
if (pivotKind == ElementKind.METHOD) {
238-
result = mixinElement.augmented.lookUpMethod(
237+
result = mixinElement.lookUpMethod2(
239238
name: pivotName,
240239
library: pivotLibrary,
241240
);
242241
} else if (pivotKind == ElementKind.GETTER) {
243-
result = mixinElement.augmented.lookUpGetter(
242+
result = mixinElement.lookUpGetter2(
244243
name: pivotName,
245244
library: pivotLibrary,
246245
);
247246
} else if (pivotKind == ElementKind.SETTER) {
248-
result = mixinElement.augmented.lookUpSetter(
247+
result = mixinElement.lookUpSetter2(
249248
name: pivotName,
250249
library: pivotLibrary,
251250
);
252251
} else if (pivotKind == ElementKind.FIELD) {
253-
result = mixinElement.augmented.lookUpGetter(
252+
result = mixinElement.lookUpGetter2(
254253
name: pivotName,
255254
library: pivotLibrary,
256255
);
257256
if (result == null && !pivotFieldFinal) {
258-
result = mixinElement.augmented.lookUpSetter(
257+
result = mixinElement.lookUpSetter2(
259258
name: pivotName,
260259
library: pivotLibrary,
261260
);

pkg/analyzer/lib/dart/element/element2.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ abstract class InstanceElement2
11771177
///
11781178
/// The behavior of this method is defined by the Dart Language Specification
11791179
/// in section 17.18 Lookup.
1180-
PropertyAccessorElement2? lookUpGetter2({
1180+
GetterElement? lookUpGetter2({
11811181
required String name,
11821182
required LibraryElement2 library,
11831183
});
@@ -1192,6 +1192,17 @@ abstract class InstanceElement2
11921192
required String name,
11931193
required LibraryElement2 library,
11941194
});
1195+
1196+
/// Returns the element representing the setter that results from looking up
1197+
/// the given [name] in this class with respect to the given [library],
1198+
/// or `null` if the look up fails.
1199+
///
1200+
/// The behavior of this method is defined by the Dart Language Specification
1201+
/// in section 17.18 Lookup.
1202+
SetterElement? lookUpSetter2({
1203+
required String name,
1204+
required LibraryElement2 library,
1205+
});
11951206
}
11961207

11971208
/// The portion of an [InstanceElement2] contributed by a single declaration.

0 commit comments

Comments
 (0)