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():