@@ -20,6 +20,21 @@ import 'package:analyzer/src/dart/element/element.dart';
2020import 'package:analyzer/src/dart/element/type_system.dart' ;
2121import '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+
2338abstract 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
154173class 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
0 commit comments