Skip to content

Commit 5e0f044

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Migrate ChangeTo.
Change-Id: I025734d07bf531d8c097ba508b55f6ca6ce8bdef Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389762 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 42830f7 commit 5e0f044

File tree

5 files changed

+163
-57
lines changed

5 files changed

+163
-57
lines changed

pkg/analysis_server/analyzer_use_new_elements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ lib/src/services/correction/dart/add_trailing_comma.dart
250250
lib/src/services/correction/dart/add_type_annotation.dart
251251
lib/src/services/correction/dart/assign_to_local_variable.dart
252252
lib/src/services/correction/dart/change_argument_name.dart
253+
lib/src/services/correction/dart/change_to.dart
253254
lib/src/services/correction/dart/change_to_nearest_precise_value.dart
254255
lib/src/services/correction/dart/change_to_static_access.dart
255256
lib/src/services/correction/dart/change_type_annotation.dart
@@ -1514,4 +1515,4 @@ tool/spec/codegen_protocol_constants.dart
15141515
tool/spec/from_html.dart
15151516
tool/spec/generate_all.dart
15161517
tool/spec/implied_types.dart
1517-
tool/spec/to_html.dart
1518+
tool/spec/to_html.dart

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

Lines changed: 49 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
1010
import 'package:analyzer/dart/ast/ast.dart';
1111
import 'package:analyzer/dart/ast/syntactic_entity.dart';
1212
import 'package:analyzer/dart/ast/token.dart';
13-
import 'package:analyzer/dart/element/element.dart';
13+
import 'package:analyzer/dart/element/element2.dart';
1414
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1515
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1616
import 'package:analyzer_plugin/utilities/range_factory.dart';
1717

1818
/// A predicate is a one-argument function that returns a boolean value.
19-
typedef _ElementPredicate = bool Function(Element argument);
19+
typedef _ElementPredicate = bool Function(Element2 argument);
2020

2121
class ChangeTo extends ResolvedCorrectionProducer {
2222
/// The kind of elements that should be proposed.
@@ -82,10 +82,10 @@ class ChangeTo extends ResolvedCorrectionProducer {
8282
};
8383
}
8484

85-
Iterable<ParameterElement> _formalParameterSuggestions(
86-
FunctionTypedElement element,
85+
Iterable<FormalParameterElement> _formalParameterSuggestions(
86+
FunctionTypedElement2 element,
8787
Iterable<FormalParameter> formalParameters) {
88-
return element.parameters.where((superParam) =>
88+
return element.formalParameters.where((superParam) =>
8989
superParam.isNamed &&
9090
!formalParameters
9191
.any((param) => superParam.name == param.name?.lexeme));
@@ -95,7 +95,7 @@ class ChangeTo extends ResolvedCorrectionProducer {
9595
var node = this.node;
9696
if (node is Annotation) {
9797
var name = node.name;
98-
if (name.staticElement == null) {
98+
if (name.element == null) {
9999
if (node.arguments != null) {
100100
await _proposeClassOrMixin(builder, name);
101101
}
@@ -112,7 +112,7 @@ class ChangeTo extends ResolvedCorrectionProducer {
112112
nameToken = node.name2;
113113
} else if (node is PrefixedIdentifier &&
114114
node.parent is NamedType &&
115-
node.prefix.staticElement is PrefixElement) {
115+
node.prefix.element is PrefixElement2) {
116116
prefixName = node.prefix.name;
117117
nameToken = node.identifier.token;
118118
} else if (node is SimpleIdentifier) {
@@ -122,18 +122,16 @@ class ChangeTo extends ResolvedCorrectionProducer {
122122
if (nameToken != null) {
123123
// Prepare for selecting the closest element.
124124
var finder = _ClosestElementFinder(
125-
nameToken.lexeme, (Element element) => element is InterfaceElement);
125+
nameToken.lexeme, (element) => element is InterfaceElement2);
126126
// Check elements of this library.
127127
if (prefixName == null) {
128-
for (var unit in unitResult.libraryElement.units) {
129-
finder._updateList(unit.classes);
130-
}
128+
finder._updateList(unitResult.libraryElement2.classes);
131129
}
132130
// Check elements from imports.
133131
for (var importElement
134-
in unitResult.libraryElement.definingCompilationUnit.libraryImports) {
135-
if (importElement.prefix?.element.name == prefixName) {
136-
var namespace = getImportNamespace(importElement);
132+
in unitResult.libraryElement2.firstFragment.libraryImports2) {
133+
if (importElement.prefix2?.element.name == prefixName) {
134+
var namespace = getImportNamespace2(importElement);
137135
finder._updateList(namespace.values);
138136
}
139137
}
@@ -144,22 +142,21 @@ class ChangeTo extends ResolvedCorrectionProducer {
144142

145143
Future<void> _proposeClassOrMixinMember(ChangeBuilder builder, Token node,
146144
Expression? target, _ElementPredicate predicate) async {
147-
var targetIdentifierElement =
148-
target is Identifier ? target.staticElement : null;
145+
var targetIdentifierElement = target is Identifier ? target.element : null;
149146
var finder = _ClosestElementFinder(node.lexeme, predicate);
150147
// unqualified invocation
151148
if (target == null) {
152149
var clazz = this.node.thisOrAncestorOfType<ClassDeclaration>();
153150
if (clazz != null) {
154-
var interfaceElement = clazz.declaredElement!;
151+
var interfaceElement = clazz.declaredFragment!.element;
155152
_updateFinderWithClassMembers(finder, interfaceElement);
156153
}
157154
} else if (target is ExtensionOverride) {
158-
_updateFinderWithExtensionMembers(finder, target.element);
159-
} else if (targetIdentifierElement is ExtensionElement) {
155+
_updateFinderWithExtensionMembers(finder, target.element2);
156+
} else if (targetIdentifierElement is ExtensionElement2) {
160157
_updateFinderWithExtensionMembers(finder, targetIdentifierElement);
161158
} else {
162-
var interfaceElement = getTargetInterfaceElement(target);
159+
var interfaceElement = getTargetInterfaceElement2(target);
163160
if (interfaceElement != null) {
164161
_updateFinderWithClassMembers(finder, interfaceElement);
165162
}
@@ -194,9 +191,8 @@ class ChangeTo extends ResolvedCorrectionProducer {
194191
}
195192

196193
var type = node.type?.type;
197-
await _proposeClassOrMixinMember(builder, node.name, null,
198-
(Element element) {
199-
return element is FieldElement &&
194+
await _proposeClassOrMixinMember(builder, node.name, null, (element) {
195+
return element is FieldElement2 &&
200196
!exclusions.contains(element.name) &&
201197
!element.isSynthetic &&
202198
!element.isExternal &&
@@ -215,26 +211,25 @@ class ChangeTo extends ResolvedCorrectionProducer {
215211
var invocation = node.parent;
216212
if (invocation is MethodInvocation && invocation.methodName == node) {
217213
var target = invocation.target;
218-
if (target is SimpleIdentifier &&
219-
target.staticElement is PrefixElement) {
214+
if (target is SimpleIdentifier && target.element is PrefixElement2) {
220215
prefixName = target.name;
221216
}
222217
}
223218
}
224219
// Prepare for selecting the closest element.
225220
var finder = _ClosestElementFinder(
226-
node.name, (Element element) => element is FunctionElement);
221+
node.name, (element) => element is TopLevelFunctionElement);
227222
// Check to this library units.
228223
if (prefixName == null) {
229-
for (var unit in unitResult.libraryElement.units) {
230-
finder._updateList(unit.functions);
224+
for (var function in unitResult.libraryElement2.functions) {
225+
finder._update(function);
231226
}
232227
}
233228
// Check unprefixed imports.
234229
for (var importElement
235-
in unitResult.libraryElement.definingCompilationUnit.libraryImports) {
236-
if (importElement.prefix?.element.name == prefixName) {
237-
var namespace = getImportNamespace(importElement);
230+
in unitResult.libraryElement2.firstFragment.libraryImports2) {
231+
if (importElement.prefix2?.element.name == prefixName) {
232+
var namespace = getImportNamespace2(importElement);
238233
finder._updateList(namespace.values);
239234
}
240235
}
@@ -257,14 +252,14 @@ class ChangeTo extends ResolvedCorrectionProducer {
257252
// find getter or setter
258253
var wantGetter = node.inGetterContext();
259254
var wantSetter = node.inSetterContext();
260-
await _proposeClassOrMixinMember(builder, node.token, target,
261-
(Element element) {
262-
if (element is PropertyAccessorElement) {
263-
return wantGetter && element.isGetter ||
264-
wantSetter && element.isSetter;
265-
} else if (element is FieldElement) {
266-
return wantGetter && element.getter != null ||
267-
wantSetter && element.setter != null;
255+
await _proposeClassOrMixinMember(builder, node.token, target, (element) {
256+
if (element is GetterElement) {
257+
return wantGetter;
258+
} else if (element is SetterElement) {
259+
return wantSetter;
260+
} else if (element is FieldElement2) {
261+
return wantGetter && element.getter2 != null ||
262+
wantSetter && element.setter2 != null;
268263
}
269264
return false;
270265
});
@@ -276,7 +271,7 @@ class ChangeTo extends ResolvedCorrectionProducer {
276271
var parent = node.parent;
277272
if (parent is MethodInvocation && node is SimpleIdentifier) {
278273
await _proposeClassOrMixinMember(builder, node.token, parent.realTarget,
279-
(Element element) => element is MethodElement && !element.isOperator);
274+
(element) => element is MethodElement2 && !element.isOperator);
280275
}
281276
}
282277

@@ -291,27 +286,26 @@ class ChangeTo extends ResolvedCorrectionProducer {
291286
var formalParameters = constructorDeclaration.parameters.parameters
292287
.whereType<DefaultFormalParameter>();
293288

294-
var finder =
295-
_ClosestElementFinder(superParameter.name.lexeme, (Element e) => true);
289+
var finder = _ClosestElementFinder(superParameter.name.lexeme, (e) => true);
296290

297291
var superInvocation = constructorDeclaration.initializers.lastOrNull;
298292

299293
if (superInvocation is SuperConstructorInvocation) {
300-
var staticElement = superInvocation.staticElement;
301-
if (staticElement == null) return;
294+
var element = superInvocation.element;
295+
if (element == null) return;
302296

303-
var list = _formalParameterSuggestions(staticElement, formalParameters);
297+
var list = _formalParameterSuggestions(element, formalParameters);
304298
finder._updateList(list);
305299
} else {
306300
var targetClassNode =
307301
superParameter.thisOrAncestorOfType<ClassDeclaration>();
308302
if (targetClassNode == null) return;
309303

310-
var targetClassElement = targetClassNode.declaredElement!;
304+
var targetClassElement = targetClassNode.declaredFragment!.element;
311305
var superType = targetClassElement.supertype;
312306
if (superType == null) return;
313307

314-
for (var constructor in superType.constructors) {
308+
for (var constructor in superType.constructors2) {
315309
if (constructor.name.isEmpty) {
316310
var list = _formalParameterSuggestions(constructor, formalParameters);
317311
finder._updateList(list);
@@ -335,20 +329,20 @@ class ChangeTo extends ResolvedCorrectionProducer {
335329
}
336330

337331
void _updateFinderWithClassMembers(
338-
_ClosestElementFinder finder, InterfaceElement clazz) {
339-
var members = getMembers(clazz);
332+
_ClosestElementFinder finder, InterfaceElement2 clazz) {
333+
var members = getMembers2(clazz);
340334
finder._updateList(members);
341335
}
342336

343337
void _updateFinderWithExtensionMembers(
344-
_ClosestElementFinder finder, ExtensionElement? element) {
338+
_ClosestElementFinder finder, ExtensionElement2? element) {
345339
if (element != null) {
346-
finder._updateList(getExtensionMembers(element));
340+
finder._updateList(getExtensionMembers2(element));
347341
}
348342
}
349343
}
350344

351-
/// Helper for finding [Element] with name closest to the given.
345+
/// Helper for finding [Element2] with name closest to the given.
352346
class _ClosestElementFinder {
353347
/// The maximum Levenshtein distance between the existing name and a possible
354348
/// replacement before the replacement is deemed to not be worth offering.
@@ -363,11 +357,11 @@ class _ClosestElementFinder {
363357

364358
int _distance = _maxDistance;
365359

366-
Element? _element;
360+
Element2? _element;
367361

368362
_ClosestElementFinder(this._targetName, this._predicate);
369363

370-
void _update(Element element) {
364+
void _update(Element2 element) {
371365
if (_predicate(element)) {
372366
var name = element.name;
373367
if (name != null) {
@@ -380,7 +374,7 @@ class _ClosestElementFinder {
380374
}
381375
}
382376

383-
void _updateList(Iterable<Element> elements) {
377+
void _updateList(Iterable<Element2> elements) {
384378
for (var element in elements) {
385379
_update(element);
386380
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
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/dart/element/visitor.dart';
8+
import 'package:analyzer/dart/element/visitor2.dart';
79

810
/// Return the [Element] that is either [root], or one of its direct or
911
/// indirect children, and has the given [nameOffset].
@@ -26,6 +28,12 @@ void visitChildren(Element element, BoolElementProcessor processor) {
2628
element.visitChildren(_ElementVisitorAdapter(processor));
2729
}
2830

31+
/// Uses [processor] to visit all of the children of [element].
32+
/// If [processor] returns `true`, then children of a child are visited too.
33+
void visitChildren2(Element2 element, BoolElementProcessor2 processor) {
34+
element.visitChildren2(_ElementVisitorAdapter2(processor));
35+
}
36+
2937
/// Uses [processor] to visit all of the top-level elements of [library].
3038
void visitLibraryTopLevelElements(
3139
LibraryElement library, VoidElementProcessor processor) {
@@ -36,6 +44,10 @@ void visitLibraryTopLevelElements(
3644
/// If `true` is returned, children of [element] will be visited.
3745
typedef BoolElementProcessor = bool Function(Element element);
3846

47+
/// An [Element2] processor function type.
48+
/// If `true` is returned, children of [element] will be visited.
49+
typedef BoolElementProcessor2 = bool Function(Element2 element);
50+
3951
/// An [Element] processor function type.
4052
typedef VoidElementProcessor = void Function(Element element);
4153

@@ -71,6 +83,21 @@ class _ElementVisitorAdapter extends GeneralizingElementVisitor<void> {
7183
}
7284
}
7385

86+
/// A [GeneralizingElementVisitor] adapter for [BoolElementProcessor2].
87+
class _ElementVisitorAdapter2 extends GeneralizingElementVisitor2<void> {
88+
final BoolElementProcessor2 processor;
89+
90+
_ElementVisitorAdapter2(this.processor);
91+
92+
@override
93+
void visitElement(Element2 element) {
94+
var visitChildren = processor(element);
95+
if (visitChildren == true) {
96+
element.visitChildren2(this);
97+
}
98+
}
99+
}
100+
74101
/// A [GeneralizingElementVisitor] for visiting top-level elements.
75102
class _TopLevelElementsVisitor extends GeneralizingElementVisitor<void> {
76103
final VoidElementProcessor processor;

0 commit comments

Comments
 (0)