Elements. Migrate RemoveLeadingUnderscore.

Change-Id: I09535fc1fc2a65e2ed370e3fabe75a81a8f579fc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/387411
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index 647da81..12d37c8 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -341,6 +341,7 @@
 lib/src/services/correction/dart/remove_interpolation_braces.dart
 lib/src/services/correction/dart/remove_invocation.dart
 lib/src/services/correction/dart/remove_late.dart
+lib/src/services/correction/dart/remove_leading_underscore.dart
 lib/src/services/correction/dart/remove_lexeme.dart
 lib/src/services/correction/dart/remove_library_name.dart
 lib/src/services/correction/dart/remove_method_declaration.dart
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_leading_underscore.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_leading_underscore.dart
index 8818208..607fb00 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_leading_underscore.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_leading_underscore.dart
@@ -6,7 +6,7 @@
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -29,22 +29,22 @@
   Future<void> compute(ChangeBuilder builder) async {
     var node = this.node;
     Token? nameToken;
-    Element? element;
+    Element2? element;
     if (node is SimpleIdentifier) {
       nameToken = node.token;
-      element = node.staticElement;
+      element = node.element;
     } else if (node is FormalParameter) {
       nameToken = node.name;
-      element = node.declaredElement;
+      element = node.declaredFragment?.element;
     } else if (node is VariableDeclaration) {
       nameToken = node.name;
-      element = node.declaredElement;
+      element = node.declaredElement2 ?? node.declaredFragment?.element;
     } else if (node is DeclaredVariablePattern) {
       nameToken = node.name;
-      element = node.declaredElement;
+      element = node.declaredElement2;
     } else if (node is FunctionDeclaration) {
       nameToken = node.name;
-      element = node.declaredElement;
+      element = node.declaredElement2 ?? node.declaredFragment?.element;
     } else {
       return;
     }
@@ -61,11 +61,11 @@
     var newName = oldName.substring(1);
 
     // Find references to the identifier.
-    List<SimpleIdentifier>? references;
-    if (element is LocalVariableElement || element is FunctionElement) {
+    List<AstNode>? references;
+    if (element is LocalVariableElement2 || element is LocalFunctionElement) {
       var block = node.thisOrAncestorOfType<Block>();
       if (block != null) {
-        references = findLocalElementReferences(block, element as LocalElement);
+        references = findLocalElementReferences3(block, element);
 
         var declaration = block.thisOrAncestorOfType<MethodDeclaration>() ??
             block.thisOrAncestorOfType<FunctionDeclaration>();
@@ -80,7 +80,7 @@
           }
         }
       }
-    } else if (element is ParameterElement) {
+    } else if (element is FormalParameterElement) {
       if (!element.isNamed) {
         var root = node
             .thisOrAncestorMatching((node) =>
@@ -89,13 +89,13 @@
                 node.parent is ConstructorDeclaration)
             ?.parent;
         if (root != null) {
-          references = findLocalElementReferences(root, element);
+          references = findLocalElementReferences3(root, element);
         }
       }
-    } else if (element is PrefixElement) {
+    } else if (element is PrefixElement2) {
       var root = node.thisOrAncestorOfType<CompilationUnit>();
       if (root != null) {
-        references = findPrefixElementReferences(root, element);
+        references = findPrefixElementReferences2(root, element);
       }
     }
     if (references == null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index aa708a6..ca7de04 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -52,8 +52,7 @@
 
 /// Return references to the [element] inside the [root] node.
 /// (Unlike [findLocalElementReferences], visits list and record pattern assignments).
-List<AstNode> findLocalElementReferences3(
-    AstNode root, LocalVariableElement2 element) {
+List<AstNode> findLocalElementReferences3(AstNode root, Element2 element) {
   var collector = _ElementReferenceCollector3(element);
   root.accept(collector);
   return collector.references;
@@ -67,6 +66,14 @@
   return collector.references;
 }
 
+/// Return references to the [element] inside the [root] node.
+List<AstNode> findPrefixElementReferences2(
+    AstNode root, PrefixElement2 element) {
+  var collector = _ElementReferenceCollector3(element);
+  root.accept(collector);
+  return collector.references;
+}
+
 // TODO(scheglov): replace with nodes once there will be
 // [CompilationUnit.getComments].
 /// Returns [SourceRange]s of all comments in [unit].
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index cb71fda..4bfa225 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5037,10 +5037,7 @@
   @experimental
   @override
   BindPatternVariableElement2? get declaredElement2 {
-    if (declaredElement case BindPatternVariableElementImpl declaredElement) {
-      return BindPatternVariableElementImpl2(declaredElement);
-    }
-    return null;
+    return declaredElement?.element2;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 1a68e7c..f2e04ee 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -189,7 +189,14 @@
   /// pattern variable with the same name within the same pattern.
   bool isDuplicate = false;
 
-  BindPatternVariableElementImpl(this.node, super.name, super.offset);
+  BindPatternVariableElementImpl(this.node, super.name, super.offset) {
+    _element2 = BindPatternVariableElementImpl2(this);
+  }
+
+  @override
+  BindPatternVariableElementImpl2 get element2 {
+    return _element2 as BindPatternVariableElementImpl2;
+  }
 }
 
 class BindPatternVariableElementImpl2 extends PatternVariableElementImpl2
@@ -6512,8 +6519,7 @@
 /// A concrete implementation of a [LocalVariableElement].
 class LocalVariableElementImpl extends NonParameterVariableElementImpl
     implements LocalVariableElement {
-  late final LocalVariableElementImpl2? element2 =
-      LocalVariableElementImpl2(this);
+  late LocalVariableElementImpl2 _element2 = LocalVariableElementImpl2(this);
 
   @override
   late bool hasInitializer;
@@ -6522,6 +6528,8 @@
   /// [offset].
   LocalVariableElementImpl(super.name, super.offset);
 
+  LocalVariableElementImpl2 get element2 => _element2;
+
   @override
   String get identifier {
     return '$name$nameOffset';
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 8ae77ee..5ff6680 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -118,7 +118,7 @@
     } else if (self is FunctionElementImpl &&
         self.enclosingElement3 is! CompilationUnitElement) {
       // TODO(scheglov): update `FunctionElementImpl.element` return type?
-      return LocalFunctionElementImpl(self);
+      return self.element2;
     } else if (self is LabelElementImpl) {
       return self.element2;
     } else if (self is LocalVariableElementImpl) {