Skip to content

Commit b1e740f

Browse files
DanTupCommit Queue
authored and
Commit Queue
committed
[analysis_server] Migrate Overrides + DocumentationComputer
`DocumentComputer` currently makes use of `asElement2` to allow callers to still pass `Element`s so they can be migrated in separate CLs. Change-Id: I44c49782498899d377defb90a8cd3813288c169e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/391662 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent a8b8d2f commit b1e740f

File tree

9 files changed

+132
-72
lines changed

9 files changed

+132
-72
lines changed

pkg/analysis_server/analyzer_use_new_elements.txt

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ lib/src/computer/computer_color.dart
4040
lib/src/computer/computer_folding.dart
4141
lib/src/computer/computer_highlights.dart
4242
lib/src/computer/computer_outline.dart
43+
lib/src/computer/computer_overrides.dart
4344
lib/src/computer/computer_selection_ranges.dart
4445
lib/src/context_manager.dart
4546
lib/src/domain_analysis_flags.dart
@@ -173,6 +174,7 @@ lib/src/lsp/semantic_tokens/legend.dart
173174
lib/src/lsp/semantic_tokens/mapping.dart
174175
lib/src/lsp/server_capabilities_computer.dart
175176
lib/src/lsp/snippets.dart
177+
lib/src/lsp/source_edits.dart
176178
lib/src/lsp/temporary_overlay_operation.dart
177179
lib/src/plugin/notification_manager.dart
178180
lib/src/plugin/plugin_locator.dart

pkg/analysis_server/lib/src/computer/computer_documentation.dart

+42-20
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analysis_server/src/computer/computer_overrides.dart';
6+
import 'package:analysis_server/src/utilities/extensions/element.dart';
67
import 'package:analyzer/dart/element/element.dart';
8+
import 'package:analyzer/dart/element/element2.dart';
79
import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
10+
import 'package:analyzer/src/utilities/extensions/element.dart';
811

912
/// Computes documentation for an [Element].
1013
class DartDocumentationComputer {
@@ -16,40 +19,49 @@ class DartDocumentationComputer {
1619
Element elementBeingDocumented, {
1720
bool includeSummary = false,
1821
}) {
19-
Element? element = elementBeingDocumented;
20-
if (element is FieldFormalParameterElement) {
21-
element = element.field;
22-
}
23-
if (element is ParameterElement) {
24-
element = element.enclosingElement3;
25-
}
22+
// TODO(dantup): Remove this temporary implementation used to split
23+
// migration of this class and callers into separate changes.
24+
var element2 = elementBeingDocumented.asElement2;
25+
26+
return element2 != null
27+
? compute2(element2, includeSummary: includeSummary)
28+
: null;
29+
}
30+
31+
Documentation? compute2(
32+
Element2 elementBeingDocumented, {
33+
bool includeSummary = false,
34+
}) {
35+
var element = switch (elementBeingDocumented) {
36+
FieldFormalParameterElement2() => elementBeingDocumented.field2,
37+
FormalParameterElement() => elementBeingDocumented.enclosingElement2,
38+
_ => elementBeingDocumented,
39+
};
2640
if (element == null) {
2741
// This can happen when the code is invalid, such as having a field formal
2842
// parameter for a field that does not exist.
2943
return null;
3044
}
3145

32-
Element? documentedElement;
33-
Element? documentedGetter;
46+
Element2? documentedElement;
47+
Element2? documentedGetter;
3448

3549
// Look for documentation comments of overridden members
3650
var overridden = findOverriddenElements(element);
3751
var candidates = [
3852
element,
3953
...overridden.superElements,
4054
...overridden.interfaceElements,
41-
if (element case PropertyAccessorElement(variable2: var variable?))
42-
variable
55+
if (element case GetterElement(variable3: var variable?)) variable,
56+
if (element case SetterElement(variable3: var variable?)) variable
4357
];
4458
for (var candidate in candidates) {
45-
if (candidate.documentationComment != null) {
59+
if (candidate.documentationCommentOrNull != null) {
4660
documentedElement = candidate;
4761
break;
4862
}
49-
if (documentedGetter == null &&
50-
candidate is PropertyAccessorElement &&
51-
candidate.isSetter) {
52-
var getter = candidate.correspondingGetter;
63+
if (documentedGetter == null && candidate is SetterElement) {
64+
var getter = candidate.correspondingGetter2;
5365
if (getter != null && getter.documentationComment != null) {
5466
documentedGetter = getter;
5567
}
@@ -62,16 +74,16 @@ class DartDocumentationComputer {
6274
return null;
6375
}
6476

65-
var rawDoc = documentedElement.documentationComment;
77+
var rawDoc = documentedElement.documentationCommentOrNull;
6678
if (rawDoc == null) {
6779
return null;
6880
}
6981
var result =
7082
dartdocInfo.processDartdoc(rawDoc, includeSummary: includeSummary);
7183

72-
var documentedElementClass = documentedElement.enclosingElement3;
84+
var documentedElementClass = documentedElement.enclosingElement2;
7385
if (documentedElementClass != null &&
74-
documentedElementClass != element.enclosingElement3) {
86+
documentedElementClass != element.enclosingElement2) {
7587
var documentedClass = documentedElementClass.displayName;
7688
result.full = '${result.full}\n\nCopied from `$documentedClass`.';
7789
}
@@ -83,11 +95,21 @@ class DartDocumentationComputer {
8395
/// docs (or `null`) depending on `preference`.
8496
String? computePreferred(
8597
Element element, DocumentationPreference preference) {
98+
// TODO(dantup): Remove this temporary implementation used to split
99+
// migration of this class and callers into separate changes.
100+
var element2 = element.asElement2;
101+
return element2 != null ? computePreferred2(element2, preference) : null;
102+
}
103+
104+
/// Compute documentation for [element] and return either the summary or full
105+
/// docs (or `null`) depending on `preference`.
106+
String? computePreferred2(
107+
Element2 element, DocumentationPreference preference) {
86108
if (preference == DocumentationPreference.none) {
87109
return null;
88110
}
89111

90-
var doc = compute(
112+
var doc = compute2(
91113
element,
92114
includeSummary: preference == DocumentationPreference.summary,
93115
);

pkg/analysis_server/lib/src/computer/computer_overrides.dart

+59-45
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ import 'package:analysis_server/src/collections.dart';
66
import 'package:analysis_server/src/protocol_server.dart' as proto;
77
import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/ast/token.dart';
9-
import 'package:analyzer/dart/element/element.dart';
9+
import 'package:analyzer/dart/element/element2.dart';
10+
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
11+
import 'package:collection/collection.dart';
1012

1113
/// Return the elements that the given [element] overrides.
12-
OverriddenElements findOverriddenElements(Element element) {
13-
if (element.enclosingElement3 is InterfaceElement) {
14+
OverriddenElements findOverriddenElements(Element2 element) {
15+
if (element.enclosingElement2 is InterfaceElement2) {
1416
return _OverriddenElementsFinder(element).find();
1517
}
16-
return OverriddenElements(element, <Element>[], <Element>[]);
18+
return OverriddenElements(element, <Element2>[], <Element2>[]);
1719
}
1820

1921
/// A computer for class member overrides in a Dart [CompilationUnit].
@@ -40,19 +42,19 @@ class DartUnitOverridesComputer {
4042
}
4143

4244
/// Add a new [Override] for the declaration with the given name [token].
43-
void _addOverride(Token token, Element? element) {
45+
void _addOverride(Token token, Element2? element) {
4446
if (element != null) {
4547
var overridesResult = _OverriddenElementsFinder(element).find();
4648
var superElements = overridesResult.superElements;
4749
var interfaceElements = overridesResult.interfaceElements;
4850
if (superElements.isNotEmpty || interfaceElements.isNotEmpty) {
4951
var superMember = superElements.isNotEmpty
5052
? proto.newOverriddenMember_fromEngine(
51-
superElements.first.nonSynthetic)
53+
superElements.first.nonSynthetic2)
5254
: null;
5355
var interfaceMembers = interfaceElements
5456
.map((member) =>
55-
proto.newOverriddenMember_fromEngine(member.nonSynthetic))
57+
proto.newOverriddenMember_fromEngine(member.nonSynthetic2))
5658
.toList();
5759
_overrides.add(proto.Override(token.offset, token.length,
5860
superclassMember: superMember,
@@ -67,15 +69,15 @@ class DartUnitOverridesComputer {
6769
if (classMember.isStatic) {
6870
continue;
6971
}
70-
_addOverride(classMember.name, classMember.declaredElement);
72+
_addOverride(classMember.name, classMember.declaredFragment?.element);
7173
}
7274
if (classMember is FieldDeclaration) {
7375
if (classMember.isStatic) {
7476
continue;
7577
}
7678
List<VariableDeclaration> fields = classMember.fields.variables;
7779
for (var field in fields) {
78-
_addOverride(field.name, field.declaredElement);
80+
_addOverride(field.name, field.declaredFragment?.element);
7981
}
8082
}
8183
}
@@ -85,58 +87,62 @@ class DartUnitOverridesComputer {
8587
/// The container with elements that a class member overrides.
8688
class OverriddenElements {
8789
/// The element that overrides other class members.
88-
final Element element;
90+
final Element2 element;
8991

9092
/// The elements that [element] overrides and which is defined in a class that
9193
/// is a superclass of the class that defines [element].
92-
final List<Element> superElements;
94+
final List<Element2> superElements;
9395

9496
/// The elements that [element] overrides and which is defined in a class that
9597
/// which is implemented by the class that defines [element].
96-
final List<Element> interfaceElements;
98+
final List<Element2> interfaceElements;
9799

98100
OverriddenElements(this.element, this.superElements, this.interfaceElements);
99101
}
100102

101103
class _OverriddenElementsFinder {
102-
Element _seed;
103-
LibraryElement _library;
104-
InterfaceElement _class;
104+
Element2 _seed;
105+
LibraryElement2 _library;
106+
InterfaceElement2 _class;
105107
String _name;
106108
List<ElementKind> _kinds;
107109

108-
final List<Element> _superElements = <Element>[];
109-
final List<Element> _interfaceElements = <Element>[];
110-
final Set<InterfaceElement> _visited = {};
110+
final List<Element2> _superElements = <Element2>[];
111+
final List<Element2> _interfaceElements = <Element2>[];
112+
final Set<InterfaceElement2> _visited = {};
111113

112-
factory _OverriddenElementsFinder(Element seed) {
113-
var class_ = seed.enclosingElement3 as InterfaceElement;
114-
var library = class_.library;
114+
factory _OverriddenElementsFinder(Element2 seed) {
115+
var class_ = seed.enclosingElement2 as InterfaceElement2;
116+
var library = class_.library2;
115117
var name = seed.displayName;
116118
List<ElementKind> kinds;
117-
if (seed is FieldElement) {
119+
if (seed is FieldElement2) {
118120
kinds = [
119121
ElementKind.GETTER,
120122
if (!seed.isFinal) ElementKind.SETTER,
121123
];
122-
} else if (seed is MethodElement) {
124+
} else if (seed is MethodElement2) {
123125
kinds = const [ElementKind.METHOD];
124-
} else if (seed is PropertyAccessorElement) {
125-
kinds = seed.isGetter
126-
? const [ElementKind.GETTER]
127-
: const [ElementKind.SETTER];
126+
} else if (seed is GetterElement) {
127+
kinds = const [ElementKind.GETTER];
128+
} else if (seed is SetterElement) {
129+
kinds = const [ElementKind.SETTER];
128130
} else {
129131
kinds = const [];
130132
}
131133
return _OverriddenElementsFinder._(seed, library, class_, name, kinds);
132134
}
133135

134136
_OverriddenElementsFinder._(
135-
this._seed, this._library, this._class, this._name, this._kinds);
137+
this._seed,
138+
this._library,
139+
this._class,
140+
this._name,
141+
this._kinds,
142+
);
136143

137144
/// Add the [OverriddenElements] for this element.
138145
OverriddenElements find() {
139-
_class = _class.augmented.declaration;
140146
_visited.clear();
141147
_addSuperOverrides(_class, withThisType: false);
142148
_visited.clear();
@@ -145,7 +151,7 @@ class _OverriddenElementsFinder {
145151
return OverriddenElements(_seed, _superElements, _interfaceElements);
146152
}
147153

148-
void _addInterfaceOverrides(InterfaceElement? class_, bool checkType) {
154+
void _addInterfaceOverrides(InterfaceElement2? class_, bool checkType) {
149155
if (class_ == null) {
150156
return;
151157
}
@@ -161,13 +167,13 @@ class _OverriddenElementsFinder {
161167
}
162168
// interfaces
163169
for (var interfaceType in class_.interfaces) {
164-
_addInterfaceOverrides(interfaceType.element, true);
170+
_addInterfaceOverrides(interfaceType.element3, true);
165171
}
166172
// super
167-
_addInterfaceOverrides(class_.supertype?.element, checkType);
173+
_addInterfaceOverrides(class_.supertype?.element3, checkType);
168174
}
169175

170-
void _addSuperOverrides(InterfaceElement? class_,
176+
void _addSuperOverrides(InterfaceElement2? class_,
171177
{bool withThisType = true}) {
172178
if (class_ == null) {
173179
return;
@@ -183,39 +189,47 @@ class _OverriddenElementsFinder {
183189
}
184190
}
185191

186-
_addSuperOverrides(class_.supertype?.element);
192+
_addSuperOverrides(class_.supertype?.element3);
187193
for (var mixin_ in class_.mixins) {
188-
_addSuperOverrides(mixin_.element);
194+
_addSuperOverrides(mixin_.element3);
189195
}
190-
if (class_ is MixinElement) {
196+
if (class_ is MixinElement2) {
191197
for (var constraint in class_.superclassConstraints) {
192-
_addSuperOverrides(constraint.element);
198+
_addSuperOverrides(constraint.element3);
193199
}
194200
}
195201
}
196202

197-
Element? _lookupMember(InterfaceElement classElement) {
198-
Element? member;
203+
Element2? _lookupMember(InterfaceElement2 classElement) {
204+
var name = Name.forLibrary(_library, _name);
205+
206+
/// Helper to find an element in [elements] that matches [targetName].
207+
Element2? findMatchingElement(
208+
Iterable<Element2> elements, Name targetName) {
209+
return elements.firstWhereOrNull((Element2 element) {
210+
var elementName = element.name3;
211+
return elementName != null &&
212+
Name.forLibrary(element.library2, elementName) == targetName;
213+
});
214+
}
215+
199216
// method
200217
if (_kinds.contains(ElementKind.METHOD)) {
201-
var augmented = classElement.augmented;
202-
member = augmented.lookUpMethod(name: _name, library: _library);
218+
var member = findMatchingElement(classElement.methods2, name);
203219
if (member != null) {
204220
return member;
205221
}
206222
}
207223
// getter
208224
if (_kinds.contains(ElementKind.GETTER)) {
209-
var augmented = classElement.augmented;
210-
member = augmented.lookUpGetter(name: _name, library: _library);
225+
var member = findMatchingElement(classElement.getters2, name.forGetter);
211226
if (member != null) {
212227
return member;
213228
}
214229
}
215230
// setter
216231
if (_kinds.contains(ElementKind.SETTER)) {
217-
var augmented = classElement.augmented;
218-
member = augmented.lookUpSetter(name: '$_name=', library: _library);
232+
var member = findMatchingElement(classElement.setters2, name.forSetter);
219233
if (member != null) {
220234
return member;
221235
}

pkg/analysis_server/lib/src/protocol_server.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,9 @@ Location newLocation_fromUnit(
329329
}
330330

331331
/// Construct based on an element from the analyzer engine.
332-
OverriddenMember newOverriddenMember_fromEngine(engine.Element member) {
333-
var element = convertElement(member);
334-
var className = member.enclosingElement3!.displayName;
332+
OverriddenMember newOverriddenMember_fromEngine(engine.Element2 member) {
333+
var element = convertElement2(member);
334+
var className = member.enclosingElement2!.displayName;
335335
return OverriddenMember(element, className);
336336
}
337337

pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class TransformSetManager {
4040
/// Return the transform sets associated with the [library].
4141
List<TransformSet> forLibrary(LibraryElement2 library) {
4242
var transformSets = <TransformSet>[];
43-
var analysisContext = library.session!.analysisContext;
43+
var analysisContext = library.session.analysisContext;
4444
var workspace = analysisContext.contextRoot.workspace;
4545
var libraryPath = library.firstFragment.source.fullName;
4646
var package = workspace.findPackageFor(libraryPath);

0 commit comments

Comments
 (0)