Skip to content

Commit f0561dc

Browse files
bwilkersonCommit Queue
authored andcommitted
[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 <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 6acaf9b commit f0561dc

File tree

3 files changed

+148
-39
lines changed

3 files changed

+148
-39
lines changed

pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'package:analysis_server/lsp_protocol/protocol.dart' hide MessageType;
86
import 'package:analysis_server/src/analysis_server.dart' show MessageType;
97
import 'package:analysis_server/src/lsp/client_capabilities.dart';
@@ -17,9 +15,8 @@ import 'package:analysis_server/src/services/refactoring/legacy/refactoring.dart
1715
import 'package:analysis_server/src/services/refactoring/legacy/rename_unit_member.dart';
1816
import 'package:analysis_server/src/utilities/extensions/string.dart';
1917
import 'package:analyzer/dart/ast/ast.dart';
20-
import 'package:analyzer/dart/element/element.dart';
18+
import 'package:analyzer/dart/element/element2.dart';
2119
import 'package:analyzer/src/dart/ast/utilities.dart';
22-
import 'package:analyzer/src/utilities/extensions/element.dart';
2320

2421
AstNode? _tweakLocatedNode(AstNode? node, int offset) {
2522
if (node is RepresentationDeclaration) {
@@ -67,22 +64,24 @@ class PrepareRenameHandler
6764
return (unit, offset).mapResults((unit, offset) async {
6865
var node = NodeLocator(offset).searchWithin(unit.unit);
6966
node = _tweakLocatedNode(node, offset);
70-
var element =
71-
server.getElementOfNode2(node, useMockForImport: true).asElement;
67+
var element = server.getElementOfNode2(node, useMockForImport: true);
7268

7369
if (node == null || element == null) {
7470
return success(null);
7571
}
7672

77-
var refactorDetails = RenameRefactoring.getElementToRename(node, element);
73+
var refactorDetails = RenameRefactoring.getElementToRename2(
74+
node,
75+
element,
76+
);
7877
if (refactorDetails == null) {
7978
return success(null);
8079
}
8180

82-
var refactoring = RenameRefactoring.create(
81+
var refactoring = RenameRefactoring.create2(
8382
server.refactoringWorkspace,
8483
unit,
85-
refactorDetails.element,
84+
refactorDetails.element2,
8685
);
8786
if (refactoring == null) {
8887
return success(null);
@@ -164,21 +163,23 @@ class RenameHandler extends LspMessageHandler<RenameParams, WorkspaceEdit?> {
164163
) async {
165164
var node = NodeLocator(offset).searchWithin(unit.unit);
166165
node = _tweakLocatedNode(node, offset);
167-
var element =
168-
server.getElementOfNode2(node, useMockForImport: true).asElement;
166+
var element = server.getElementOfNode2(node, useMockForImport: true);
169167
if (node == null || element == null) {
170168
return success(null);
171169
}
172170

173-
var refactorDetails = RenameRefactoring.getElementToRename(node, element);
171+
var refactorDetails = RenameRefactoring.getElementToRename2(
172+
node,
173+
element,
174+
);
174175
if (refactorDetails == null) {
175176
return success(null);
176177
}
177178

178-
var refactoring = RenameRefactoring.create(
179+
var refactoring = RenameRefactoring.create2(
179180
server.refactoringWorkspace,
180181
unit,
181-
refactorDetails.element,
182+
refactorDetails.element2,
182183
);
183184
if (refactoring == null) {
184185
return success(null);
@@ -281,10 +282,11 @@ class RenameHandler extends LspMessageHandler<RenameParams, WorkspaceEdit?> {
281282
// class which is not necessarily the one where the rename was invoked.
282283
var declaringFile =
283284
(refactoring as RenameUnitMemberRefactoringImpl)
284-
.element
285-
.declaration
285+
.element2
286+
.firstFragment
287+
.libraryFragment
286288
?.source
287-
?.fullName;
289+
.fullName;
288290
if (declaringFile != null) {
289291
var folder = pathContext.dirname(declaringFile);
290292
var actualFilename = pathContext.basename(declaringFile);
@@ -324,7 +326,7 @@ class RenameHandler extends LspMessageHandler<RenameParams, WorkspaceEdit?> {
324326

325327
bool _isClassRename(RenameRefactoring refactoring) =>
326328
refactoring is RenameUnitMemberRefactoringImpl &&
327-
refactoring.element is InterfaceElement;
329+
refactoring.element2 is InterfaceElement2;
328330

329331
/// Asks the user whether they would like to rename the file along with the
330332
/// class.

pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart

Lines changed: 123 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -616,16 +616,23 @@ abstract class RenameRefactoring implements Refactoring {
616616
element = declaredParameterElement(node, element);
617617
}
618618

619+
Element2? element2;
619620
// Use the prefix offset/length when renaming an import directive.
620-
if (node is ImportDirective && element is LibraryImportElement) {
621-
var prefix = node.prefix;
622-
if (prefix != null) {
623-
offset = prefix.offset;
624-
length = prefix.length;
625-
} else {
626-
// -1 means the name does not exist yet.
627-
offset = -1;
628-
length = 0;
621+
if (element is LibraryImportElement) {
622+
if (node is ImportDirective) {
623+
var prefix = node.prefix;
624+
if (prefix != null) {
625+
offset = prefix.offset;
626+
length = prefix.length;
627+
} else {
628+
// -1 means the name does not exist yet.
629+
offset = -1;
630+
length = 0;
631+
}
632+
}
633+
var importNode = node.thisOrAncestorOfType<ImportDirective>();
634+
if (importNode != null) {
635+
element2 = MockLibraryImportElement(importNode.libraryImport!);
629636
}
630637
}
631638

@@ -641,18 +648,122 @@ abstract class RenameRefactoring implements Refactoring {
641648
return null;
642649
}
643650

644-
return RenameRefactoringElement(element, offset, length);
651+
return RenameRefactoringElement(element, element2, offset, length);
652+
}
653+
654+
/// Returns the best element to rename based on the [node] and [element] (for
655+
/// example, the class when on the `new` keyword).
656+
static RenameRefactoringElement? getElementToRename2(
657+
AstNode node,
658+
Element2? element,
659+
) {
660+
// TODO(scheglov): This is bad code.
661+
SyntacticEntity? nameNode;
662+
if (node is AssignedVariablePattern) {
663+
nameNode = node.name;
664+
} else if (node is ConstructorDeclaration) {
665+
nameNode = node;
666+
} else if (node is ConstructorSelector) {
667+
nameNode = node;
668+
} else if (node is DeclaredIdentifier) {
669+
nameNode = node.name;
670+
} else if (node is DeclaredVariablePattern) {
671+
nameNode = node.name;
672+
} else if (node is EnumConstantDeclaration) {
673+
nameNode = node.name;
674+
} else if (node is ExtensionDeclaration) {
675+
nameNode = node.name;
676+
} else if (node is ExtensionOverride) {
677+
nameNode = node.name;
678+
} else if (node is FieldFormalParameter) {
679+
nameNode = node.name;
680+
} else if (node is ImportDirective) {
681+
nameNode = node;
682+
} else if (node is ImportPrefixReference) {
683+
nameNode = node;
684+
} else if (node is InstanceCreationExpression) {
685+
nameNode = node;
686+
} else if (node is LibraryDirective) {
687+
nameNode = node;
688+
} else if (node is MethodDeclaration) {
689+
nameNode = node.name;
690+
} else if (node is NamedCompilationUnitMember) {
691+
nameNode = node.name;
692+
} else if (node is NamedType) {
693+
nameNode = node.name2;
694+
} else if (node is RepresentationConstructorName) {
695+
nameNode = node.name;
696+
} else if (node is RepresentationDeclaration) {
697+
nameNode = node.fieldName;
698+
} else if (node is SimpleFormalParameter) {
699+
nameNode = node.name;
700+
} else if (node is SimpleIdentifier) {
701+
nameNode = node.token;
702+
} else if (node is TypeParameter) {
703+
nameNode = node.name;
704+
} else if (node is VariableDeclaration) {
705+
nameNode = node.name;
706+
}
707+
if (nameNode == null) {
708+
return null;
709+
}
710+
var offset = nameNode.offset;
711+
var length = nameNode.length;
712+
713+
if (node is SimpleIdentifier && element is FormalParameterElement) {
714+
element = declaredParameterElement(node, element.asElement).asElement2;
715+
}
716+
717+
// Use the prefix offset/length when renaming an import directive.
718+
if (element is MockLibraryImportElement) {
719+
if (node is ImportDirective) {
720+
var prefix = node.prefix;
721+
if (prefix != null) {
722+
offset = prefix.offset;
723+
length = prefix.length;
724+
} else {
725+
// -1 means the name does not exist yet.
726+
offset = -1;
727+
length = 0;
728+
}
729+
}
730+
}
731+
732+
// Rename the class when on `new` in an instance creation.
733+
if (node is InstanceCreationExpression) {
734+
var namedType = node.constructorName.type;
735+
element = namedType.element2;
736+
offset = namedType.name2.offset;
737+
length = namedType.name2.length;
738+
}
739+
740+
if (element == null) {
741+
return null;
742+
}
743+
744+
return RenameRefactoringElement(
745+
element.asElement!,
746+
element,
747+
offset,
748+
length,
749+
);
645750
}
646751
}
647752

648753
class RenameRefactoringElement {
649754
final Element element;
755+
final Element2? _element2;
650756
final int offset;
651757
final int length;
652758

653-
RenameRefactoringElement(this.element, this.offset, this.length);
759+
RenameRefactoringElement(
760+
this.element,
761+
this._element2,
762+
this.offset,
763+
this.length,
764+
);
654765

655766
Element2 get element2 {
656-
return element.asElement2!;
767+
return _element2 ?? element.asElement2!;
657768
}
658769
}

pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'dart:async';
86

97
import 'package:analysis_server/src/collections.dart';
@@ -18,7 +16,6 @@ import 'package:analyzer/dart/ast/ast.dart';
1816
import 'package:analyzer/dart/element/element2.dart';
1917
import 'package:analyzer/src/dart/ast/utilities.dart';
2018
import 'package:analyzer/src/utilities/cancellation.dart';
21-
import 'package:analyzer/src/utilities/extensions/element.dart';
2219

2320
int test_resetCount = 0;
2421

@@ -315,26 +312,25 @@ class RefactoringManager {
315312
var resolvedUnit = await server.getResolvedUnit(file);
316313
if (resolvedUnit != null) {
317314
var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
318-
var element =
319-
server.getElementOfNode2(node, useMockForImport: true)?.asElement;
315+
var element = server.getElementOfNode2(node, useMockForImport: true);
320316
if (node is RepresentationDeclaration) {
321317
var extensionType = node.parent;
322318
if (extensionType is ExtensionTypeDeclaration &&
323319
extensionType.name.end == offset) {
324-
element = extensionType.declaredElement;
320+
element = extensionType.declaredFragment?.element;
325321
}
326322
}
327323
if (node != null && element != null) {
328-
var renameElement = RenameRefactoring.getElementToRename(
324+
var renameElement = RenameRefactoring.getElementToRename2(
329325
node,
330326
element,
331327
);
332328
if (renameElement != null) {
333329
// do create the refactoring
334-
refactoring = RenameRefactoring.create(
330+
refactoring = RenameRefactoring.create2(
335331
refactoringWorkspace,
336332
resolvedUnit,
337-
renameElement.element,
333+
renameElement.element2,
338334
);
339335
feedback = RenameFeedback(
340336
renameElement.offset,

0 commit comments

Comments
 (0)