Elements. Migrate RemoveUnusedElement.

Change-Id: I616a2078b8c08cb8400cc8297fac118086b2bab0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389640
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index 3e07d76..a746f33 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -415,6 +415,7 @@
 lib/src/services/correction/dart/remove_unnecessary_string_escape.dart
 lib/src/services/correction/dart/remove_unnecessary_string_interpolation.dart
 lib/src/services/correction/dart/remove_unnecessary_wildcard_pattern.dart
+lib/src/services/correction/dart/remove_unused.dart
 lib/src/services/correction/dart/remove_unused_catch_clause.dart
 lib/src/services/correction/dart/remove_unused_catch_stack.dart
 lib/src/services/correction/dart/remove_unused_import.dart
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
index 4bfb45a..16a68e2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -7,7 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -39,34 +39,39 @@
       return;
     }
 
-    if (node is ClassDeclaration ||
-        node is EnumDeclaration ||
-        node is FunctionDeclaration ||
-        node is FunctionTypeAlias ||
-        node is MethodDeclaration ||
-        node is VariableDeclaration) {
-      var element = node is Declaration
-          ? node.declaredElement!
-          : (node as NamedCompilationUnitMember).declaredElement!;
-      var references = _findAllReferences(unit, element);
-      // TODO(pq): consider filtering for references that are limited to within the class.
-      if (references.isEmpty) {
-        var parent = node.parent;
-        var grandParent = parent?.parent;
-        SourceRange sourceRange;
-        if (node is VariableDeclaration &&
-            parent is VariableDeclarationList &&
-            grandParent != null) {
-          if (parent.variables.length == 1) {
-            sourceRange = utils.getLinesRange(range.node(grandParent));
-          } else {
-            sourceRange = range.nodeInList(parent.variables, node);
-          }
+    var element = switch (node) {
+      ClassDeclaration() => node.declaredFragment?.element,
+      EnumDeclaration() => node.declaredFragment?.element,
+      FunctionDeclaration() =>
+        node.declaredElement2 ?? node.declaredFragment?.element,
+      FunctionTypeAlias() => node.declaredFragment?.element,
+      GenericTypeAlias() => node.declaredFragment?.element,
+      MethodDeclaration() => node.declaredFragment?.element,
+      VariableDeclaration() => node.declaredFragment?.element,
+      _ => null,
+    };
+    if (element == null) {
+      return;
+    }
+
+    var references = _findAllReferences(unit, element);
+    // TODO(pq): consider filtering for references that are limited to within the class.
+    if (references.isEmpty) {
+      var parent = node.parent;
+      var grandParent = parent?.parent;
+      SourceRange sourceRange;
+      if (node is VariableDeclaration &&
+          parent is VariableDeclarationList &&
+          grandParent != null) {
+        if (parent.variables.length == 1) {
+          sourceRange = utils.getLinesRange(range.node(grandParent));
         } else {
-          sourceRange = utils.getLinesRange(range.node(node));
+          sourceRange = range.nodeInList(parent.variables, node);
         }
-        sourceRanges.add(sourceRange);
+      } else {
+        sourceRange = utils.getLinesRange(range.node(node));
       }
+      sourceRanges.add(sourceRange);
     }
 
     await builder.addDartFileEdit(file, (builder) {
@@ -116,8 +121,8 @@
       return;
     }
 
-    var element = declaration.declaredElement;
-    if (element is! FieldElement) {
+    var element = declaration.declaredFragment!.element;
+    if (element is! FieldElement2) {
       return;
     }
 
@@ -243,16 +248,16 @@
 }
 
 class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
-  final Element element;
+  final Element2 element;
   final List<AstNode> references = [];
 
   _ElementReferenceCollector(this.element);
 
   @override
   void visitFieldFormalParameter(FieldFormalParameter node) {
-    var declaredElement = node.declaredElement;
-    if (declaredElement is FieldFormalParameterElement) {
-      if (declaredElement.field == element) {
+    var declaredElement = node.declaredFragment!.element;
+    if (declaredElement is FieldFormalParameterElement2) {
+      if (declaredElement.field2 == element) {
         references.add(node);
       }
     }
@@ -262,7 +267,7 @@
 
   @override
   void visitNamedType(NamedType node) {
-    if (node.element == element) {
+    if (node.element2 == element) {
       references.add(node);
     }
 
@@ -271,15 +276,19 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    var staticElement = node.writeOrReadElement;
+    var staticElement = node.writeOrReadElement2;
     if (staticElement == element) {
       references.add(node);
-    } else if (staticElement is PropertyAccessorElement) {
-      if (staticElement.variable2 == element) {
+    } else if (staticElement is GetterElement) {
+      if (staticElement.variable3 == element) {
         references.add(node);
       }
-    } else if (staticElement is FieldFormalParameterElement) {
-      if (staticElement.field == element) {
+    } else if (staticElement is SetterElement) {
+      if (staticElement.variable3 == element) {
+        references.add(node);
+      }
+    } else if (staticElement is FieldFormalParameterElement2) {
+      if (staticElement.field2 == element) {
         references.add(node);
       }
     }
@@ -289,7 +298,7 @@
 abstract class _RemoveUnused extends ResolvedCorrectionProducer {
   _RemoveUnused({required super.context});
 
-  List<AstNode> _findAllReferences(AstNode root, Element element) {
+  List<AstNode> _findAllReferences(AstNode root, Element2 element) {
     var collector = _ElementReferenceCollector(element);
     root.accept(collector);
     return collector.references;