44
55import 'package:analysis_server/src/services/correction/namespace.dart' ;
66import 'package:analysis_server/src/services/refactoring/legacy/refactoring.dart' ;
7+ import 'package:analysis_server_plugin/src/utilities/selection.dart' ;
78import 'package:analyzer/dart/ast/ast.dart' ;
89import 'package:analyzer/dart/element/element.dart' ;
910import 'package:analyzer/src/dart/ast/element_locator.dart' ;
1011import 'package:analyzer/src/utilities/extensions/element.dart' ;
1112import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
13+ import 'package:collection/collection.dart' ;
1214import 'package:test/test.dart' ;
1315
1416import 'abstract_refactoring.dart' ;
@@ -20,11 +22,30 @@ class RenameRefactoringTest extends RefactoringTest {
2022
2123 /// Asserts that [refactoring] has potential edits in [testFile] at offset
2224 /// of the given [searches] .
23- void assertPotentialEdits (List <String > searches) {
25+ ///
26+ /// If [searches] is `null` , it will use the positions/ranges marked in
27+ /// [parsedTestCode] to determine the offsets.
28+ void assertPotentialEdits ({List <String >? searches, List <int >? indexes}) {
2429 var expectedOffsets = < int > {};
25- for (var search in searches) {
26- var offset = findOffset (search);
27- expectedOffsets.add (offset);
30+ if (searches != null ) {
31+ for (var search in searches) {
32+ var offset = findOffset (search);
33+ expectedOffsets.add (offset);
34+ }
35+ } else if (parsedTestCode.positions.isNotEmpty) {
36+ for (var position in parsedTestCode.positions.whereIndexed (
37+ (index, _) => indexes? .contains (index) ?? true ,
38+ )) {
39+ expectedOffsets.add (position.offset);
40+ }
41+ } else if (parsedTestCode.ranges.isNotEmpty) {
42+ for (var range in parsedTestCode.ranges.whereIndexed (
43+ (index, _) => indexes? .contains (index) ?? true ,
44+ )) {
45+ expectedOffsets.add (range.sourceRange.offset);
46+ }
47+ } else {
48+ fail ('No searches or positions provided for potential edits.' );
2849 }
2950 // remove offset marked as potential
3051 for (var potentialId in refactoring.potentialEditIds) {
@@ -36,24 +57,35 @@ class RenameRefactoringTest extends RefactoringTest {
3657 expect (expectedOffsets, isEmpty);
3758 }
3859
60+ /// Creates a refactoring and sets the offset and length from the
61+ /// [parsedTestCode] position/range at the given [index] .
62+ void createRenameRefactoring ([int index = 0 ]) {
63+ setPositionOrRange (index);
64+ var unit = testAnalysisResult.unit;
65+ var node = unit.select (length: length, offset: offset)? .coveringNode;
66+ if (node == null ) {
67+ fail ('No node found at offset $offset with length $length .' );
68+ }
69+ createRenameRefactoringForNode (node);
70+ }
71+
3972 /// Creates a new [RenameRefactoring] in [refactoring] for the element of
4073 /// the [SimpleIdentifier] at the given [search] pattern.
4174 void createRenameRefactoringAtString (String search) {
4275 var node = findNode.any (search);
4376
44- Element ? element;
45- switch (node) {
46- case ImportDirective ():
47- element = MockLibraryImportElement (node.libraryImport! );
48- default :
49- element = ElementLocator .locate (node);
77+ if (node is ImportDirective ) {
78+ return createRenameRefactoringForElement2 (
79+ MockLibraryImportElement (node.libraryImport! ),
80+ );
5081 }
51-
52- if (node is SimpleIdentifier && element is PrefixElement ) {
53- element = MockLibraryImportElement ( getImportElement (node) ! );
82+ var element = ElementLocator . locate (node);
83+ if (node is ! SimpleIdentifier || element is ! PrefixElement ) {
84+ return createRenameRefactoringForElement2 (element );
5485 }
55-
56- createRenameRefactoringForElement2 (element);
86+ createRenameRefactoringForElement2 (
87+ MockLibraryImportElement (getImportElement (node)! ),
88+ );
5789 }
5890
5991 /// Creates a new [RenameRefactoring] in [refactoring] for [element] .
@@ -71,7 +103,23 @@ class RenameRefactoringTest extends RefactoringTest {
71103 this .refactoring = refactoring;
72104 }
73105
74- /// Returns the [Edit] with the given [id] , maybe `null` .
106+ void createRenameRefactoringForNode (AstNode node) {
107+ Element ? element;
108+ switch (node) {
109+ case ImportDirective ():
110+ element = MockLibraryImportElement (node.libraryImport! );
111+ default :
112+ element = ElementLocator .locate (node);
113+ }
114+
115+ if (node is SimpleIdentifier && element is PrefixElement ) {
116+ element = MockLibraryImportElement (getImportElement (node)! );
117+ }
118+
119+ createRenameRefactoringForElement2 (element);
120+ }
121+
122+ /// Returns the [SourceEdit] with the given [id] , maybe `null` .
75123 SourceEdit findEditById (String id) {
76124 for (var fileEdit in refactoringChange.edits) {
77125 for (var edit in fileEdit.edits) {
0 commit comments