[migration] refactoring_manager.dart and handler_rename.dart

Change-Id: I9294afbec0d472fb87c595d0e9c9b9ca2a2cc838
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410444
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
index 2ffa22c..16c6180 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore_for_file: analyzer_use_new_elements
-
 import 'package:analysis_server/lsp_protocol/protocol.dart' hide MessageType;
 import 'package:analysis_server/src/analysis_server.dart' show MessageType;
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
@@ -17,9 +15,8 @@
 import 'package:analysis_server/src/services/refactoring/legacy/rename_unit_member.dart';
 import 'package:analysis_server/src/utilities/extensions/string.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 AstNode? _tweakLocatedNode(AstNode? node, int offset) {
   if (node is RepresentationDeclaration) {
@@ -67,22 +64,24 @@
     return (unit, offset).mapResults((unit, offset) async {
       var node = NodeLocator(offset).searchWithin(unit.unit);
       node = _tweakLocatedNode(node, offset);
-      var element =
-          server.getElementOfNode2(node, useMockForImport: true).asElement;
+      var element = server.getElementOfNode2(node, useMockForImport: true);
 
       if (node == null || element == null) {
         return success(null);
       }
 
-      var refactorDetails = RenameRefactoring.getElementToRename(node, element);
+      var refactorDetails = RenameRefactoring.getElementToRename2(
+        node,
+        element,
+      );
       if (refactorDetails == null) {
         return success(null);
       }
 
-      var refactoring = RenameRefactoring.create(
+      var refactoring = RenameRefactoring.create2(
         server.refactoringWorkspace,
         unit,
-        refactorDetails.element,
+        refactorDetails.element2,
       );
       if (refactoring == null) {
         return success(null);
@@ -164,21 +163,23 @@
     ) async {
       var node = NodeLocator(offset).searchWithin(unit.unit);
       node = _tweakLocatedNode(node, offset);
-      var element =
-          server.getElementOfNode2(node, useMockForImport: true).asElement;
+      var element = server.getElementOfNode2(node, useMockForImport: true);
       if (node == null || element == null) {
         return success(null);
       }
 
-      var refactorDetails = RenameRefactoring.getElementToRename(node, element);
+      var refactorDetails = RenameRefactoring.getElementToRename2(
+        node,
+        element,
+      );
       if (refactorDetails == null) {
         return success(null);
       }
 
-      var refactoring = RenameRefactoring.create(
+      var refactoring = RenameRefactoring.create2(
         server.refactoringWorkspace,
         unit,
-        refactorDetails.element,
+        refactorDetails.element2,
       );
       if (refactoring == null) {
         return success(null);
@@ -281,10 +282,11 @@
         // class which is not necessarily the one where the rename was invoked.
         var declaringFile =
             (refactoring as RenameUnitMemberRefactoringImpl)
-                .element
-                .declaration
+                .element2
+                .firstFragment
+                .libraryFragment
                 ?.source
-                ?.fullName;
+                .fullName;
         if (declaringFile != null) {
           var folder = pathContext.dirname(declaringFile);
           var actualFilename = pathContext.basename(declaringFile);
@@ -324,7 +326,7 @@
 
   bool _isClassRename(RenameRefactoring refactoring) =>
       refactoring is RenameUnitMemberRefactoringImpl &&
-      refactoring.element is InterfaceElement;
+      refactoring.element2 is InterfaceElement2;
 
   /// Asks the user whether they would like to rename the file along with the
   /// class.
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
index 959f243..52aee6c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
@@ -616,16 +616,23 @@
       element = declaredParameterElement(node, element);
     }
 
+    Element2? element2;
     // Use the prefix offset/length when renaming an import directive.
-    if (node is ImportDirective && element is LibraryImportElement) {
-      var prefix = node.prefix;
-      if (prefix != null) {
-        offset = prefix.offset;
-        length = prefix.length;
-      } else {
-        // -1 means the name does not exist yet.
-        offset = -1;
-        length = 0;
+    if (element is LibraryImportElement) {
+      if (node is ImportDirective) {
+        var prefix = node.prefix;
+        if (prefix != null) {
+          offset = prefix.offset;
+          length = prefix.length;
+        } else {
+          // -1 means the name does not exist yet.
+          offset = -1;
+          length = 0;
+        }
+      }
+      var importNode = node.thisOrAncestorOfType<ImportDirective>();
+      if (importNode != null) {
+        element2 = MockLibraryImportElement(importNode.libraryImport!);
       }
     }
 
@@ -641,18 +648,122 @@
       return null;
     }
 
-    return RenameRefactoringElement(element, offset, length);
+    return RenameRefactoringElement(element, element2, offset, length);
+  }
+
+  /// Returns the best element to rename based on the [node] and [element] (for
+  /// example, the class when on the `new` keyword).
+  static RenameRefactoringElement? getElementToRename2(
+    AstNode node,
+    Element2? element,
+  ) {
+    // TODO(scheglov): This is bad code.
+    SyntacticEntity? nameNode;
+    if (node is AssignedVariablePattern) {
+      nameNode = node.name;
+    } else if (node is ConstructorDeclaration) {
+      nameNode = node;
+    } else if (node is ConstructorSelector) {
+      nameNode = node;
+    } else if (node is DeclaredIdentifier) {
+      nameNode = node.name;
+    } else if (node is DeclaredVariablePattern) {
+      nameNode = node.name;
+    } else if (node is EnumConstantDeclaration) {
+      nameNode = node.name;
+    } else if (node is ExtensionDeclaration) {
+      nameNode = node.name;
+    } else if (node is ExtensionOverride) {
+      nameNode = node.name;
+    } else if (node is FieldFormalParameter) {
+      nameNode = node.name;
+    } else if (node is ImportDirective) {
+      nameNode = node;
+    } else if (node is ImportPrefixReference) {
+      nameNode = node;
+    } else if (node is InstanceCreationExpression) {
+      nameNode = node;
+    } else if (node is LibraryDirective) {
+      nameNode = node;
+    } else if (node is MethodDeclaration) {
+      nameNode = node.name;
+    } else if (node is NamedCompilationUnitMember) {
+      nameNode = node.name;
+    } else if (node is NamedType) {
+      nameNode = node.name2;
+    } else if (node is RepresentationConstructorName) {
+      nameNode = node.name;
+    } else if (node is RepresentationDeclaration) {
+      nameNode = node.fieldName;
+    } else if (node is SimpleFormalParameter) {
+      nameNode = node.name;
+    } else if (node is SimpleIdentifier) {
+      nameNode = node.token;
+    } else if (node is TypeParameter) {
+      nameNode = node.name;
+    } else if (node is VariableDeclaration) {
+      nameNode = node.name;
+    }
+    if (nameNode == null) {
+      return null;
+    }
+    var offset = nameNode.offset;
+    var length = nameNode.length;
+
+    if (node is SimpleIdentifier && element is FormalParameterElement) {
+      element = declaredParameterElement(node, element.asElement).asElement2;
+    }
+
+    // Use the prefix offset/length when renaming an import directive.
+    if (element is MockLibraryImportElement) {
+      if (node is ImportDirective) {
+        var prefix = node.prefix;
+        if (prefix != null) {
+          offset = prefix.offset;
+          length = prefix.length;
+        } else {
+          // -1 means the name does not exist yet.
+          offset = -1;
+          length = 0;
+        }
+      }
+    }
+
+    // Rename the class when on `new` in an instance creation.
+    if (node is InstanceCreationExpression) {
+      var namedType = node.constructorName.type;
+      element = namedType.element2;
+      offset = namedType.name2.offset;
+      length = namedType.name2.length;
+    }
+
+    if (element == null) {
+      return null;
+    }
+
+    return RenameRefactoringElement(
+      element.asElement!,
+      element,
+      offset,
+      length,
+    );
   }
 }
 
 class RenameRefactoringElement {
   final Element element;
+  final Element2? _element2;
   final int offset;
   final int length;
 
-  RenameRefactoringElement(this.element, this.offset, this.length);
+  RenameRefactoringElement(
+    this.element,
+    this._element2,
+    this.offset,
+    this.length,
+  );
 
   Element2 get element2 {
-    return element.asElement2!;
+    return _element2 ?? element.asElement2!;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart
index da0bf93..e2d95e5 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore_for_file: analyzer_use_new_elements
-
 import 'dart:async';
 
 import 'package:analysis_server/src/collections.dart';
@@ -18,7 +16,6 @@
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/utilities/cancellation.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 int test_resetCount = 0;
 
@@ -315,26 +312,25 @@
       var resolvedUnit = await server.getResolvedUnit(file);
       if (resolvedUnit != null) {
         var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
-        var element =
-            server.getElementOfNode2(node, useMockForImport: true)?.asElement;
+        var element = server.getElementOfNode2(node, useMockForImport: true);
         if (node is RepresentationDeclaration) {
           var extensionType = node.parent;
           if (extensionType is ExtensionTypeDeclaration &&
               extensionType.name.end == offset) {
-            element = extensionType.declaredElement;
+            element = extensionType.declaredFragment?.element;
           }
         }
         if (node != null && element != null) {
-          var renameElement = RenameRefactoring.getElementToRename(
+          var renameElement = RenameRefactoring.getElementToRename2(
             node,
             element,
           );
           if (renameElement != null) {
             // do create the refactoring
-            refactoring = RenameRefactoring.create(
+            refactoring = RenameRefactoring.create2(
               refactoringWorkspace,
               resolvedUnit,
-              renameElement.element,
+              renameElement.element2,
             );
             feedback = RenameFeedback(
               renameElement.offset,