Elements. Return Element2 from Identifier.element, specifically LocalVariableElement2.
Change-Id: If8cb0e75472b542371f8eea794350135b3551283
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/386964
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 87c637d..d4e8a07 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -1300,6 +1300,11 @@
abstract class LocalFunctionElement implements ExecutableElement2 {
/// The function in which the variable is defined.
ExecutableFragment get enclosingFunction;
+
+ /// The offset of the name of this element in the file that contains the
+ /// declaration of this element, or `-1` if this element is synthetic, does
+ /// not have a name, or otherwise does not have an offset.
+ int get nameOffset;
}
/// A local variable.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 3d8722b..e70b7cd 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -9400,13 +9400,7 @@
@experimental
@override
Element2? get element {
- var element = staticElement;
- if (element case Fragment fragment) {
- return fragment.element;
- } else if (element case Element2 element) {
- return element;
- }
- return null;
+ return staticElement.asElement2;
}
@override
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0c14e6e..22a35b78 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6482,6 +6482,9 @@
List<ElementAnnotation> get metadata => _wrappedElement.metadata;
@override
+ int get nameOffset => _wrappedElement.nameOffset;
+
+ @override
DartType get returnType => _wrappedElement.returnType;
@override
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index e825a23..8ae77ee 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -8,6 +8,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
import 'package:meta/meta.dart';
extension Element2OrNullExtension on Element2? {
@@ -126,6 +127,9 @@
return self;
} else if (self is NeverElementImpl) {
return self;
+ } else if (self is ParameterMember) {
+ // TODO(scheglov): we lose types here
+ return self.declaration.asElement2;
} else if (self is PrefixElementImpl) {
return self;
} else {
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index dcb84c9..e6bbcbd 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -2805,10 +2805,10 @@
identifier: SimpleIdentifier
token: loadLibrary
staticElement: loadLibrary@-1
-<exception>
+ element: loadLibrary@-1
staticType: Future<dynamic> Function()
staticElement: loadLibrary@-1
-<exception>
+ element: loadLibrary@-1
staticType: Future<dynamic> Function()
semicolon: ;
''');
@@ -2829,7 +2829,7 @@
function: SimpleIdentifier
token: foo
staticElement: foo@20
-<exception>
+ element: foo@20
staticType: void Function<T>(T)
typeArguments: TypeArgumentList
leftBracket: <
diff --git a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
index ba08fb7..4424f86 100644
--- a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
@@ -162,7 +162,7 @@
SimpleIdentifier
token: _
staticElement: _@52
-<exception>
+ element: _@52
staticType: Null Function()
''');
}
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index bf6568c..7a7573c 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -2286,7 +2286,7 @@
methodName: SimpleIdentifier
token: loadLibrary
staticElement: loadLibrary@-1
-<exception>
+ element: loadLibrary@-1
staticType: Future<dynamic> Function()
argumentList: ArgumentList
leftParenthesis: (
@@ -3554,7 +3554,7 @@
methodName: SimpleIdentifier
token: loadLibrary
staticElement: loadLibrary@-1
-<exception>
+ element: loadLibrary@-1
staticType: Future<dynamic> Function()
argumentList: ArgumentList
leftParenthesis: (
@@ -3588,7 +3588,7 @@
methodName: SimpleIdentifier
token: loadLibrary
staticElement: loadLibrary@-1
-<exception>
+ element: loadLibrary@-1
staticType: Future<dynamic> Function()
argumentList: ArgumentList
leftParenthesis: (
@@ -6604,7 +6604,7 @@
methodName: SimpleIdentifier
token: g
staticElement: g@20
-<exception>
+ element: g@20
staticType: double Function(int, String)
argumentList: ArgumentList
leftParenthesis: (
@@ -6635,7 +6635,7 @@
methodName: SimpleIdentifier
token: g
staticElement: g@15
-<exception>
+ element: g@15
staticType: T Function<T, U>(T, U)
argumentList: ArgumentList
leftParenthesis: (
@@ -6671,7 +6671,7 @@
methodName: SimpleIdentifier
token: g
staticElement: g@15
-<exception>
+ element: g@15
staticType: T Function<T>([T?])
argumentList: ArgumentList
leftParenthesis: (
@@ -6704,7 +6704,7 @@
methodName: SimpleIdentifier
token: g
staticElement: g@15
-<exception>
+ element: g@15
staticType: T Function<T>({required T a})
argumentList: ArgumentList
leftParenthesis: (
@@ -6716,7 +6716,7 @@
staticElement: ParameterMember
base: g@15::@parameter::a
substitution: {T: int}
- element: <null>
+ element: g@15::@parameter::a#element
staticType: null
colon: :
expression: IntegerLiteral
@@ -7129,7 +7129,7 @@
methodName: SimpleIdentifier
token: foo
staticElement: foo@16
-<exception>
+ element: foo@16
staticType: void Function(int)
argumentList: ArgumentList
leftParenthesis: (
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_test.dart
index 0786f1d..a941a0c 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_test.dart
@@ -84,7 +84,7 @@
staticElement: ParameterMember
base: <testLibraryFragment>::@function::foo::@parameter::x
substitution: {T: int}
- element: <null>
+ element: <testLibraryFragment>::@function::foo::@parameter::x#element
staticType: null
colon: :
expression: IntegerLiteral
diff --git a/pkg/analyzer/test/util/element_printer.dart b/pkg/analyzer/test/util/element_printer.dart
index 6fdcb6d..36fff38 100644
--- a/pkg/analyzer/test/util/element_printer.dart
+++ b/pkg/analyzer/test/util/element_printer.dart
@@ -105,6 +105,8 @@
_sink.write('${element.name}@${element.nameOffset}');
case LibraryElementImpl e:
writeReference(e.reference!);
+ case LocalFunctionElementImpl():
+ _sink.write('${element.name}@${element.nameOffset}');
case LocalVariableElementImpl():
_sink.write('${element.name}@${element.nameOffset}');
case LocalVariableElementImpl2():