Skip to content

Commit 4bb2269

Browse files
fshcheglovCommit Queue
authored andcommitted
Fix renaming super formal parameters in long subclass chains.
Bug: #61194 Change-Id: Icb3b8e5044e13e046122490e1dfceb5dc944eafe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442170 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent c6f5e69 commit 4bb2269

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,19 +114,16 @@ class RenameParameterRefactoringImpl extends RenameRefactoringImpl {
114114
}
115115
var references = await searchEngine.searchReferences(element);
116116

117-
// Remove references that don't have to have the same name.
117+
// Named super formals are already in [elements].
118+
// Positional super formals are not tied by name so shouldn't be renamed.
119+
references.removeWhere(
120+
(match) => match.element is analyzer.SuperFormalParameterElement,
121+
);
118122

119123
// Implicit references to optional positional parameters.
120124
if (element.isOptionalPositional) {
121125
references.removeWhere((match) => match.sourceRange.length == 0);
122126
}
123-
// References to positional parameters from super-formal.
124-
if (element.isPositional) {
125-
references.removeWhere(
126-
(match) => match.element is analyzer.SuperFormalParameterElement,
127-
);
128-
}
129-
130127
processor.addReferenceEdits(references);
131128
}
132129
}
@@ -136,6 +133,17 @@ class RenameParameterRefactoringImpl extends RenameRefactoringImpl {
136133
var element = this.element;
137134
if (element.isNamed) {
138135
elements = await getHierarchyNamedParameters(searchEngine, element);
136+
137+
// Iteratively collect superFormalParameter(s) of subclasses.
138+
for (var i = 0; i < elements.length; i++) {
139+
var element = elements[i];
140+
var references = await searchEngine.searchReferences(element);
141+
elements.addAll(
142+
references
143+
.map((match) => match.element)
144+
.whereType<analyzer.SuperFormalParameterElement>(),
145+
);
146+
}
139147
} else if (element.isPositional) {
140148
elements = await getHierarchyPositionalParameters(searchEngine, element);
141149
}

pkg/analysis_server/test/services/refactoring/legacy/rename_parameter_test.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ class A {
202202
class B extends A {
203203
B({required super.test});
204204
}
205+
class C extends B {
206+
C({required super.test});
207+
}
208+
class D extends C {
209+
D({required super.test});
210+
}
205211
''');
206212
// configure refactoring
207213
createRenameRefactoringAtString('test}); // 0');
@@ -216,6 +222,12 @@ class A {
216222
class B extends A {
217223
B({required super.newName});
218224
}
225+
class C extends B {
226+
C({required super.newName});
227+
}
228+
class D extends C {
229+
D({required super.newName});
230+
}
219231
''');
220232
}
221233

0 commit comments

Comments
 (0)