Skip to content

Commit 38e7078

Browse files
author
Dart CI
committed
Version 2.15.0-285.0.dev
Merge commit '56e7532f99f85150968bed6b54f3301960a1bcd3' into 'dev'
2 parents 35c3945 + 56e7532 commit 38e7078

File tree

6 files changed

+177
-56
lines changed

6 files changed

+177
-56
lines changed

pkg/analysis_server/lib/src/cider/rename.dart

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,46 @@ import 'package:analyzer/src/dart/micro/utils.dart';
1414
class CanRenameResponse {
1515
final LineInfo lineInfo;
1616
final RenameRefactoringElement refactoringElement;
17-
final String oldName;
17+
final FileResolver _fileResolver;
18+
final String filePath;
19+
20+
CanRenameResponse(this.lineInfo, this.refactoringElement, this._fileResolver,
21+
this.filePath);
1822

19-
CanRenameResponse(this.lineInfo, this.refactoringElement, this.oldName);
23+
String get oldName => refactoringElement.element.displayName;
24+
25+
CheckNameResponse? checkNewName(String name) {
26+
var element = refactoringElement.element;
27+
RefactoringStatus? status;
28+
if (element is LocalVariableElement) {
29+
status = validateVariableName(name);
30+
} else if (element is ParameterElement) {
31+
status = validateParameterName(name);
32+
} else if (element is FunctionElement) {
33+
status = validateFunctionName(name);
34+
}
35+
if (status == null) {
36+
return null;
37+
}
38+
return CheckNameResponse(status, this);
39+
}
2040
}
2141

2242
class CheckNameResponse {
23-
final LineInfo lineInfo;
2443
final RefactoringStatus status;
25-
final String oldName;
44+
final CanRenameResponse canRename;
45+
46+
CheckNameResponse(this.status, this.canRename);
47+
48+
LineInfo get lineInfo => canRename.lineInfo;
2649

27-
CheckNameResponse(this.lineInfo, this.status, this.oldName);
50+
String get oldName => canRename.refactoringElement.element.displayName;
51+
52+
RenameResponse? computeRenameRanges() {
53+
var matches = canRename._fileResolver.findReferences(
54+
canRename.refactoringElement.offset, canRename.filePath);
55+
return RenameResponse(matches, this);
56+
}
2857
}
2958

3059
class CiderRenameComputer {
@@ -56,11 +85,12 @@ class CiderRenameComputer {
5685
}
5786
var refactoring = RenameRefactoring.getElementToRename(node, element);
5887
if (refactoring != null) {
59-
return CanRenameResponse(lineInfo, refactoring, element.displayName);
88+
return CanRenameResponse(lineInfo, refactoring, _fileResolver, filePath);
6089
}
6190
return null;
6291
}
6392

93+
@deprecated
6494
CheckNameResponse? checkNewName(
6595
String filePath, int line, int column, String name) {
6696
var resolvedUnit = _fileResolver.resolve(path: filePath);
@@ -74,6 +104,10 @@ class CiderRenameComputer {
74104
return null;
75105
}
76106

107+
var refactoring = RenameRefactoring.getElementToRename(node, element);
108+
if (refactoring == null) {
109+
return null;
110+
}
77111
RefactoringStatus? status;
78112
if (element is LocalVariableElement) {
79113
status = validateVariableName(name);
@@ -85,7 +119,9 @@ class CiderRenameComputer {
85119
if (status == null) {
86120
return null;
87121
}
88-
return CheckNameResponse(lineInfo, status, element.displayName);
122+
123+
return CheckNameResponse(status,
124+
CanRenameResponse(lineInfo, refactoring, _fileResolver, filePath));
89125
}
90126

91127
bool _canRenameElement(Element element) {
@@ -103,3 +139,10 @@ class CiderRenameComputer {
103139
return false;
104140
}
105141
}
142+
143+
class RenameResponse {
144+
final List<CiderSearchMatch> matches;
145+
final CheckNameResponse checkName;
146+
147+
RenameResponse(this.matches, this.checkName);
148+
}

pkg/analysis_server/test/src/cider/rename_test.dart

Lines changed: 80 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analysis_server/src/cider/rename.dart';
66
import 'package:analyzer/source/line_info.dart';
7+
import 'package:analyzer/src/dart/micro/resolve_file.dart';
78
import 'package:test/test.dart';
89
import 'package:test_reflective_loader/test_reflective_loader.dart';
910

@@ -29,7 +30,6 @@ class A {
2930
}
3031
''');
3132

32-
expect(refactor, isNotNull);
3333
expect(refactor!.refactoringElement.element.name, 'bar');
3434
expect(refactor.refactoringElement.offset, _correctionContext.offset);
3535
}
@@ -40,7 +40,6 @@ void ^foo() {
4040
}
4141
''');
4242

43-
expect(refactor, isNotNull);
4443
expect(refactor!.refactoringElement.element.name, 'foo');
4544
expect(refactor.refactoringElement.offset, _correctionContext.offset);
4645
}
@@ -68,7 +67,6 @@ void foo() {
6867
}
6968
''');
7069

71-
expect(refactor, isNotNull);
7270
expect(refactor!.refactoringElement.element.name, 'a');
7371
expect(refactor.refactoringElement.offset, _correctionContext.offset);
7472
}
@@ -80,7 +78,6 @@ extension E on int {
8078
}
8179
''');
8280

83-
expect(refactor, isNotNull);
8481
expect(refactor!.refactoringElement.element.name, 'foo');
8582
expect(refactor.refactoringElement.offset, _correctionContext.offset);
8683
}
@@ -112,9 +109,8 @@ void foo(int ^bar) {
112109
int ^foo() => 2;
113110
''', 'bar');
114111

115-
expect(result, isNotNull);
116-
expect(result?.status.problems.length, 0);
117-
expect(result?.oldName, 'foo');
112+
expect(result!.status.problems.length, 0);
113+
expect(result.oldName, 'foo');
118114
}
119115

120116
void test_checkName_local() {
@@ -124,9 +120,8 @@ void foo() {
124120
}
125121
''', 'bar');
126122

127-
expect(result, isNotNull);
128-
expect(result?.status.problems.length, 0);
129-
expect(result?.oldName, 'a');
123+
expect(result!.status.problems.length, 0);
124+
expect(result.oldName, 'a');
130125
}
131126

132127
void test_checkName_local_invalid() {
@@ -136,9 +131,8 @@ void foo() {
136131
}
137132
''', 'Aa');
138133

139-
expect(result, isNotNull);
140-
expect(result?.status.problems.length, 1);
141-
expect(result?.oldName, 'a');
134+
expect(result!.status.problems.length, 1);
135+
expect(result.oldName, 'a');
142136
}
143137

144138
void test_checkName_parameter() {
@@ -148,22 +142,71 @@ void foo(String ^a) {
148142
}
149143
''', 'bar');
150144

151-
expect(result, isNotNull);
152-
expect(result?.status.problems.length, 0);
153-
expect(result?.oldName, 'a');
145+
expect(result!.status.problems.length, 0);
146+
expect(result.oldName, 'a');
147+
}
148+
149+
void test_rename_local() {
150+
var result = _rename(r'''
151+
void foo() {
152+
var ^a = 0; var b = a + 1;
153+
}
154+
''', 'bar');
155+
156+
expect(result!.matches.length, 1);
157+
expect(
158+
result.matches[0],
159+
CiderSearchMatch('/workspace/dart/test/lib/test.dart',
160+
[CharacterLocation(2, 7), CharacterLocation(2, 22)]));
161+
}
162+
163+
void test_rename_method() {
164+
var a = newFile('/workspace/dart/test/lib/a.dart', content: r'''
165+
void foo() {
166+
a;
167+
}
168+
''');
169+
fileResolver.resolve(path: a.path);
170+
171+
var result = _rename(r'''
172+
import 'a.dart';
173+
174+
main() {
175+
^foo();
176+
}
177+
''', 'bar');
178+
179+
expect(result!.matches.length, 2);
180+
expect(result.matches, [
181+
CiderSearchMatch(
182+
'/workspace/dart/test/lib/a.dart', [CharacterLocation(1, 6)]),
183+
CiderSearchMatch(
184+
'/workspace/dart/test/lib/test.dart', [CharacterLocation(4, 1)])
185+
]);
186+
}
187+
188+
void test_rename_parameter() {
189+
var result = _rename(r'''
190+
void foo(String ^a) {
191+
var b = a + 1;
192+
}
193+
''', 'bar');
194+
expect(result!.matches.length, 1);
195+
expect(result.checkName.oldName, 'a');
154196
}
155197

156198
CheckNameResponse? _checkName(String content, String newName) {
157199
_updateFile(content);
158200

159201
return CiderRenameComputer(
160202
fileResolver,
161-
).checkNewName(
162-
convertPath(testPath),
163-
_correctionContext.line,
164-
_correctionContext.character,
165-
newName,
166-
);
203+
)
204+
.canRename(
205+
convertPath(testPath),
206+
_correctionContext.line,
207+
_correctionContext.character,
208+
)
209+
?.checkNewName(newName);
167210
}
168211

169212
CanRenameResponse? _compute(String content) {
@@ -178,6 +221,21 @@ void foo(String ^a) {
178221
);
179222
}
180223

224+
RenameResponse? _rename(String content, newName) {
225+
_updateFile(content);
226+
227+
return CiderRenameComputer(
228+
fileResolver,
229+
)
230+
.canRename(
231+
convertPath(testPath),
232+
_correctionContext.line,
233+
_correctionContext.character,
234+
)
235+
?.checkNewName(newName)
236+
?.computeRenameRanges();
237+
}
238+
181239
void _updateFile(String content) {
182240
var offset = content.indexOf('^');
183241
expect(offset, isPositive, reason: 'Expected to find ^');

pkg/analyzer/lib/source/line_info.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ class CharacterLocation {
1616
/// character at the given [lineNumber] and [columnNumber].
1717
CharacterLocation(this.lineNumber, this.columnNumber);
1818

19+
@override
20+
bool operator ==(Object object) =>
21+
object is CharacterLocation &&
22+
lineNumber == object.lineNumber &&
23+
columnNumber == object.columnNumber;
24+
1925
@override
2026
String toString() => '$lineNumber:$columnNumber';
2127
}

pkg/analyzer/lib/src/dart/micro/resolve_file.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/error/error.dart';
1010
import 'package:analyzer/error/listener.dart';
1111
import 'package:analyzer/file_system/file_system.dart';
12+
import 'package:analyzer/source/line_info.dart';
1213
import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
1314
import 'package:analyzer/src/context/packages.dart';
1415
import 'package:analyzer/src/dart/analysis/context_root.dart';
@@ -46,19 +47,20 @@ const memoryCacheSize = 200 * M;
4647

4748
class CiderSearchMatch {
4849
final String path;
49-
final List<int> offsets;
50+
final List<CharacterLocation?> startPositions;
5051

51-
CiderSearchMatch(this.path, this.offsets);
52+
CiderSearchMatch(this.path, this.startPositions);
5253

5354
@override
5455
bool operator ==(Object object) =>
5556
object is CiderSearchMatch &&
5657
path == object.path &&
57-
const ListEquality<int>().equals(offsets, object.offsets);
58+
const ListEquality<CharacterLocation?>()
59+
.equals(startPositions, object.startPositions);
5860

5961
@override
6062
String toString() {
61-
return '($path, $offsets)';
63+
return '($path, $startPositions)';
6264
}
6365
}
6466

@@ -202,7 +204,9 @@ class FileResolver {
202204
resolved.unit.accept(collector);
203205
var offsets = collector.offsets;
204206
if (offsets.isNotEmpty) {
205-
references.add(CiderSearchMatch(filePath, offsets));
207+
var lineInfo = resolved.unit.lineInfo;
208+
references.add(CiderSearchMatch(filePath,
209+
offsets.map((offset) => lineInfo?.getLocation(offset)).toList()));
206210
}
207211
});
208212
}

0 commit comments

Comments
 (0)