Skip to content

Commit c714269

Browse files
johnniwintherCommit Queue
authored andcommitted
[analyzer] Migrate ElementDeclarationResult
Change-Id: Iaa18a32075e2dc92d47378d90cfb801bc5884473 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408702 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 1039490 commit c714269

File tree

7 files changed

+113
-81
lines changed

7 files changed

+113
-81
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ class DefinitionHandler
334334
return null;
335335
}
336336

337-
return parsedLibrary.getElementDeclaration2(fragment);
337+
return parsedLibrary.getFragmentDeclaration(fragment);
338338
}
339339
}
340340

pkg/analyzer/api.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ package:analyzer/dart/analysis/results.dart:
154154
ElementDeclarationResult (class extends Object):
155155
new (constructor: ElementDeclarationResult Function())
156156
element (getter: Element)
157-
element2 (getter: Element2)
157+
fragment (getter: Fragment)
158158
node (getter: AstNode)
159159
parsedUnit (getter: ParsedUnitResult?)
160160
resolvedUnit (getter: ResolvedUnitResult?)
@@ -195,6 +195,7 @@ package:analyzer/dart/analysis/results.dart:
195195
units (getter: List<ParsedUnitResult>)
196196
getElementDeclaration (method: ElementDeclarationResult? Function(Element))
197197
getElementDeclaration2 (method: ElementDeclarationResult? Function(Fragment))
198+
getFragmentDeclaration (method: ElementDeclarationResult? Function(Fragment))
198199
ParsedUnitResult (class extends Object implements SomeParsedUnitResult, AnalysisResultWithErrors):
199200
new (constructor: ParsedUnitResult Function())
200201
unit (getter: CompilationUnit)

pkg/analyzer/lib/dart/analysis/results.dart

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ abstract class ElementDeclarationResult {
6262
/// The [Element] that this object describes.
6363
Element get element;
6464

65-
/// The element that this object describes.
66-
@experimental
67-
Element2 get element2;
65+
/// The [Fragment] that this object describes.
66+
Fragment get fragment;
6867

6968
/// The node that declares the [element]. Depending on whether it is returned
7069
/// from [ResolvedLibraryResult] or [ParsedLibraryResult] it might be resolved
@@ -212,8 +211,17 @@ abstract class ParsedLibraryResult
212211
/// Returns `null` if the [fragment] is synthetic.
213212
///
214213
/// Throws [ArgumentError] if the [fragment] is not defined in this library.
214+
@Deprecated('Use getFragmentDeclaration() instead')
215215
@experimental
216216
ElementDeclarationResult? getElementDeclaration2(Fragment fragment);
217+
218+
/// Returns the declaration of the [fragment].
219+
///
220+
/// Returns `null` if the [fragment] is synthetic.
221+
///
222+
/// Throws [ArgumentError] if the [fragment] is not defined in this library.
223+
@experimental
224+
ElementDeclarationResult? getFragmentDeclaration(Fragment fragment);
217225
}
218226

219227
/// The result of parsing of a single file. The errors returned include only

pkg/analyzer/lib/src/dart/analysis/results.dart

Lines changed: 79 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ import 'package:analyzer/src/dart/element/element.dart';
2020
import 'package:analyzer/src/dart/element/type_system.dart';
2121
import 'package:analyzer/src/generated/engine.dart';
2222

23+
/// This returns the offset used for finding the corresponding AST node.
24+
///
25+
/// If the fragment is named, the [Fragment.nameOffset2] is used. If the
26+
/// fragment is a a [ConstructorFragment] for an unnamed constructor, the
27+
/// [ConstructorFragment.typeNameOffset] is used.
28+
int? _getFragmentNameOffset(Fragment fragment) {
29+
var nameOffset = fragment.nameOffset2;
30+
if (nameOffset == null) {
31+
if (fragment is ConstructorFragment) {
32+
nameOffset = fragment.typeNameOffset;
33+
}
34+
}
35+
return nameOffset;
36+
}
37+
2338
abstract class AnalysisResultImpl implements AnalysisResult {
2439
@override
2540
final AnalysisSession session;
@@ -35,11 +50,11 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
3550
// type of [element]. For example, for library-level elements (classes etc),
3651
// we can iterate over the compilation unit's declarations.
3752

38-
final Element element;
53+
final Fragment fragment;
3954
final int _nameOffset;
4055
AstNode? result;
4156

42-
DeclarationByElementLocator(this.element) : _nameOffset = element.nameOffset;
57+
DeclarationByElementLocator(this.fragment, this._nameOffset);
4358

4459
@override
4560
void visitNode(AstNode node) {
@@ -49,7 +64,7 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
4964
return;
5065
}
5166

52-
if (element is InterfaceElement) {
67+
if (fragment is InterfaceFragment) {
5368
if (node is ClassDeclaration) {
5469
if (_hasOffset2(node.name)) {
5570
result = node;
@@ -71,7 +86,7 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
7186
result = node;
7287
}
7388
}
74-
} else if (element is ConstructorElement) {
89+
} else if (fragment is ConstructorFragment) {
7590
if (node is ConstructorDeclaration) {
7691
if (node.name != null) {
7792
if (_hasOffset2(node.name)) {
@@ -83,13 +98,13 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
8398
}
8499
}
85100
}
86-
} else if (element is ExtensionElement) {
101+
} else if (fragment is ExtensionFragment) {
87102
if (node is ExtensionDeclaration) {
88103
if (_hasOffset2(node.name)) {
89104
result = node;
90105
}
91106
}
92-
} else if (element is FieldElement) {
107+
} else if (fragment is FieldFragment) {
93108
if (node is EnumConstantDeclaration) {
94109
if (_hasOffset2(node.name)) {
95110
result = node;
@@ -99,23 +114,27 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
99114
result = node;
100115
}
101116
}
102-
} else if (element is FunctionElement) {
117+
} else if (fragment is TopLevelFunctionFragment) {
118+
if (node is FunctionDeclaration && _hasOffset2(node.name)) {
119+
result = node;
120+
}
121+
} else if (fragment is LocalFunctionFragment) {
103122
if (node is FunctionDeclaration && _hasOffset2(node.name)) {
104123
result = node;
105124
}
106-
} else if (element is LocalVariableElement) {
125+
} else if (fragment is LocalVariableFragment) {
107126
if (node is VariableDeclaration && _hasOffset2(node.name)) {
108127
result = node;
109128
}
110-
} else if (element is MethodElement) {
129+
} else if (fragment is MethodFragment) {
111130
if (node is MethodDeclaration && _hasOffset2(node.name)) {
112131
result = node;
113132
}
114-
} else if (element is ParameterElement) {
133+
} else if (fragment is FormalParameterFragment) {
115134
if (node is FormalParameter && _hasOffset2(node.name)) {
116135
result = node;
117136
}
118-
} else if (element is PropertyAccessorElement) {
137+
} else if (fragment is PropertyAccessorFragment) {
119138
if (node is FunctionDeclaration) {
120139
if (_hasOffset2(node.name)) {
121140
result = node;
@@ -125,11 +144,11 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
125144
result = node;
126145
}
127146
}
128-
} else if (element is TopLevelVariableElement) {
147+
} else if (fragment is TopLevelVariableFragment) {
129148
if (node is VariableDeclaration && _hasOffset2(node.name)) {
130149
result = node;
131150
}
132-
} else if (element is TypeAliasElement) {
151+
} else if (fragment is TypeAliasFragment) {
133152
if (node is GenericTypeAlias) {
134153
if (_hasOffset2(node.name)) {
135154
result = node;
@@ -153,7 +172,7 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
153172

154173
class ElementDeclarationResultImpl implements ElementDeclarationResult {
155174
@override
156-
final Element element;
175+
final Fragment fragment;
157176

158177
@override
159178
final AstNode node;
@@ -165,16 +184,14 @@ class ElementDeclarationResultImpl implements ElementDeclarationResult {
165184
final ResolvedUnitResult? resolvedUnit;
166185

167186
ElementDeclarationResultImpl(
168-
this.element, this.node, this.parsedUnit, this.resolvedUnit);
187+
this.fragment, this.node, this.parsedUnit, this.resolvedUnit);
169188

170189
@override
171-
Element2 get element2 {
172-
if (element case Fragment fragment) {
173-
return fragment.element;
174-
} else if (element case Element2 element) {
190+
Element get element {
191+
if (fragment case Element element) {
175192
return element;
176193
}
177-
throw UnimplementedError('Could not compute and element');
194+
throw UnsupportedError('${fragment.runtimeType}');
178195
}
179196
}
180197

@@ -280,40 +297,44 @@ class ParsedLibraryResultImpl extends AnalysisResultImpl
280297

281298
@override
282299
ElementDeclarationResult? getElementDeclaration(Element element) {
283-
if (element is CompilationUnitElement ||
284-
element is LibraryElement ||
285-
element.isSynthetic ||
286-
element.nameOffset == -1) {
300+
if (element case Fragment fragment) {
301+
return getFragmentDeclaration(fragment);
302+
}
303+
throw UnsupportedError('$runtimeType.getElementDeclaration($element)');
304+
}
305+
306+
@override
307+
ElementDeclarationResult? getElementDeclaration2(Fragment fragment) {
308+
return getFragmentDeclaration(fragment);
309+
}
310+
311+
@override
312+
ElementDeclarationResult? getFragmentDeclaration(Fragment fragment) {
313+
var nameOffset = _getFragmentNameOffset(fragment);
314+
if (fragment is LibraryFragment || nameOffset == null) {
287315
return null;
288316
}
289317

290-
var elementPath = element.source!.fullName;
318+
var elementPath = fragment.libraryFragment!.source.fullName;
291319
var unitResult = units.firstWhere(
292320
(r) => r.path == elementPath,
293321
orElse: () {
294-
var elementStr = element.getDisplayString();
295-
throw ArgumentError('Element (${element.runtimeType}) $elementStr is '
322+
var elementStr = fragment.element.displayName;
323+
throw ArgumentError('Element (${fragment.runtimeType}) $elementStr is '
296324
'not defined in this library.');
297325
},
298326
);
299327

300-
var locator = DeclarationByElementLocator(element);
328+
var locator = DeclarationByElementLocator(fragment, nameOffset);
301329
unitResult.unit.accept(locator);
302330
var declaration = locator.result;
303331

304332
if (declaration == null) {
305333
return null;
306334
}
307335

308-
return ElementDeclarationResultImpl(element, declaration, unitResult, null);
309-
}
310-
311-
@override
312-
ElementDeclarationResult? getElementDeclaration2(Fragment fragment) {
313-
if (fragment case Element element) {
314-
return getElementDeclaration(element);
315-
}
316-
throw UnimplementedError();
336+
return ElementDeclarationResultImpl(
337+
fragment, declaration, unitResult, null);
317338
}
318339
}
319340

@@ -414,40 +435,44 @@ class ResolvedLibraryResultImpl extends AnalysisResultImpl
414435

415436
@override
416437
ElementDeclarationResult? getElementDeclaration(Element element) {
417-
if (element is CompilationUnitElement ||
418-
element is LibraryElement ||
419-
element.isSynthetic ||
420-
element.nameOffset == -1) {
438+
if (element case Fragment fragment) {
439+
return getFragmentDeclaration(fragment);
440+
}
441+
throw UnsupportedError('$runtimeType.getElementDeclaration($element)');
442+
}
443+
444+
@override
445+
ElementDeclarationResult? getElementDeclaration2(Fragment fragment) {
446+
return getFragmentDeclaration(fragment);
447+
}
448+
449+
@override
450+
ElementDeclarationResult? getFragmentDeclaration(Fragment fragment) {
451+
var nameOffset = _getFragmentNameOffset(fragment);
452+
if (fragment is LibraryFragment || nameOffset == null) {
421453
return null;
422454
}
423455

424-
var elementPath = element.source!.fullName;
456+
var elementPath = fragment.libraryFragment!.source.fullName;
425457
var unitResult = units.firstWhere(
426458
(r) => r.path == elementPath,
427459
orElse: () {
428-
var elementStr = element.getDisplayString();
429-
throw ArgumentError('Element (${element.runtimeType}) $elementStr is '
460+
var elementStr = fragment.element.displayName;
461+
throw ArgumentError('Element (${fragment.runtimeType}) $elementStr is '
430462
'not defined in this library.');
431463
},
432464
);
433465

434-
var locator = DeclarationByElementLocator(element);
466+
var locator = DeclarationByElementLocator(fragment, nameOffset);
435467
unitResult.unit.accept(locator);
436468
var declaration = locator.result;
437469

438470
if (declaration == null) {
439471
return null;
440472
}
441473

442-
return ElementDeclarationResultImpl(element, declaration, null, unitResult);
443-
}
444-
445-
@override
446-
ElementDeclarationResult? getElementDeclaration2(Fragment fragment) {
447-
if (fragment case Element element) {
448-
return getElementDeclaration(element);
449-
}
450-
throw UnimplementedError();
474+
return ElementDeclarationResultImpl(
475+
fragment, declaration, null, unitResult);
451476
}
452477

453478
@override

pkg/analyzer/lib/src/dart/analysis/session_helper.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class AnalysisSessionHelper {
4545
Fragment fragment) async {
4646
var libraryPath = fragment.libraryFragment!.source.fullName;
4747
var resolvedLibrary = await _getResolvedLibrary(libraryPath);
48-
return resolvedLibrary?.getElementDeclaration2(fragment);
48+
return resolvedLibrary?.getFragmentDeclaration(fragment);
4949
}
5050

5151
/// Return the [EnumElement2] with the given [className] that is exported

pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,8 @@ class {}
8383
var element =
8484
findNode.classDeclaration('class {}').declaredFragment!.element;
8585
var result = await getElementDeclaration(element);
86-
var node = result!.node as ClassDeclaration;
87-
expect(node.name.lexeme, '');
88-
expect(node.name.offset, 6);
86+
// Without a name, the class declaration cannot be found.
87+
expect(result, null);
8988
}
9089

9190
test_classTypeAlias() async {
@@ -367,7 +366,6 @@ void f(int a) {}
367366
var node = result!.node as SimpleFormalParameter;
368367
expect(node.name!.lexeme, 'a');
369368
}
370-
371369
test_parameter_missingName_named() async {
372370
await resolveTestCode(r'''
373371
void f({@a}) {}
@@ -378,8 +376,8 @@ void f({@a}) {}
378376
expect(element.isNamed, isTrue);
379377

380378
var result = await getElementDeclaration(element);
381-
var node = result!.node as DefaultFormalParameter;
382-
expect(node.name!.lexeme, '');
379+
// Without a name, the parameter declaration cannot be found.
380+
expect(result, null);
383381
}
384382

385383
test_parameter_missingName_required() async {
@@ -392,8 +390,8 @@ void f(@a) {}
392390
expect(element.isPositional, isTrue);
393391

394392
var result = await getElementDeclaration(element);
395-
var node = result!.node as SimpleFormalParameter;
396-
expect(node.name!.lexeme, '');
393+
// Without a name, the parameter declaration cannot be found.
394+
expect(result, null);
397395
}
398396

399397
test_setter_class() async {
@@ -451,7 +449,7 @@ class GetElementDeclarationParsedTest extends PubPackageResolutionTest
451449
var path = element.library2!.firstFragment.source.fullName;
452450
var file = getFile(path);
453451
var library = await _getParsedLibrary(file);
454-
return library.getElementDeclaration2(element.firstFragment);
452+
return library.getFragmentDeclaration(element.firstFragment);
455453
}
456454

457455
Future<ParsedLibraryResult> _getParsedLibrary(File file) async {
@@ -469,7 +467,7 @@ class GetElementDeclarationResolvedTest extends PubPackageResolutionTest
469467
var path = element.library2!.firstFragment.source.fullName;
470468
var file = getFile(path);
471469
var library = await _getResolvedLibrary(file);
472-
return library.getElementDeclaration2(element.firstFragment);
470+
return library.getFragmentDeclaration(element.firstFragment);
473471
}
474472

475473
Future<ResolvedLibraryResult> _getResolvedLibrary(File file) async {

0 commit comments

Comments
 (0)