[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,