Skip to content

Commit 4fb83cb

Browse files
FMorschelCommit Queue
authored andcommitted
[DAS] Fixes add super invocation avoiding existing parameters
Fixes: #60533 Change-Id: I070fffc8ccc3a8ab801de2e22110d7333dec366c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422368 Reviewed-by: Brian Wilkerson <[email protected]> Auto-Submit: Felipe Morschel <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 7411ddb commit 4fb83cb

File tree

2 files changed

+104
-2
lines changed

2 files changed

+104
-2
lines changed

pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,23 @@ class _AddInvocation extends ResolvedCorrectionProducer {
103103
_constructor.formalParameters.any((p) => p.name3 == null)) {
104104
return;
105105
}
106+
var currentConstructor =
107+
node.thisOrAncestorOfType<ConstructorDeclaration>();
108+
var positionalParameters = 0;
109+
var namedParameters = <String>{};
110+
if (currentConstructor case ConstructorDeclaration(:var parameters)) {
111+
for (var parameter in parameters.parameters) {
112+
if (parameter case SuperFormalParameter(
113+
:var isPositional,
114+
) when isPositional) {
115+
positionalParameters++;
116+
} else if (parameter case DefaultFormalParameter(
117+
:SuperFormalParameter parameter,
118+
) when parameter.isNamed) {
119+
namedParameters.add(parameter.name.lexeme);
120+
}
121+
}
122+
}
106123
await builder.addDartFileEdit(file, (builder) {
107124
builder.addInsertion(_insertOffset, (builder) {
108125
builder.write(_prefix);
@@ -115,11 +132,20 @@ class _AddInvocation extends ResolvedCorrectionProducer {
115132
// add arguments
116133
builder.write('(');
117134
var firstParameter = true;
118-
for (var parameter in _constructor.formalParameters) {
135+
for (var (index, parameter) in _constructor.formalParameters.indexed) {
119136
// skip non-required parameters
120137
if (parameter.isOptional) {
121138
break;
122139
}
140+
if (parameter.isNamed && namedParameters.contains(parameter.name3)) {
141+
// skip already initialized named parameters
142+
continue;
143+
}
144+
if (parameter.isPositional && index < positionalParameters) {
145+
// skip already initialized positional parameters
146+
continue;
147+
}
148+
123149
// comma
124150
if (firstParameter) {
125151
firstParameter = false;

pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,83 @@ void main() {
1717

1818
@reflectiveTest
1919
class AddSuperConstructorInvocationTest extends FixProcessorTest
20-
with AddSuperConstructorInvocationTestCases {}
20+
with AddSuperConstructorInvocationTestCases {
21+
Future<void> test_optionalPositional() async {
22+
await resolveTestCode('''
23+
class A {
24+
A(int p1, int p2, [int? p3]);
25+
}
26+
class B extends A {
27+
B(super.p1);
28+
}
29+
''');
30+
await assertHasFix('''
31+
class A {
32+
A(int p1, int p2, [int? p3]);
33+
}
34+
class B extends A {
35+
B(super.p1) : super(0);
36+
}
37+
''');
38+
}
39+
40+
Future<void> test_requiredNamed_missingFirst() async {
41+
await resolveTestCode('''
42+
class A {
43+
A({required int p1, required int p2});
44+
}
45+
class B extends A {
46+
B({required super.p2});
47+
}
48+
''');
49+
await assertHasFix('''
50+
class A {
51+
A({required int p1, required int p2});
52+
}
53+
class B extends A {
54+
B({required super.p2}) : super(p1: 0);
55+
}
56+
''');
57+
}
58+
59+
Future<void> test_requiredNamed_missingLast() async {
60+
await resolveTestCode('''
61+
class A {
62+
A({required int p1, required int p2});
63+
}
64+
class B extends A {
65+
B({required super.p1});
66+
}
67+
''');
68+
await assertHasFix('''
69+
class A {
70+
A({required int p1, required int p2});
71+
}
72+
class B extends A {
73+
B({required super.p1}) : super(p2: 0);
74+
}
75+
''');
76+
}
77+
78+
Future<void> test_requiredPositional_oneNamed() async {
79+
await resolveTestCode('''
80+
class A {
81+
A(int p1, int p2, {required int p3});
82+
}
83+
class B extends A {
84+
B(super.p1);
85+
}
86+
''');
87+
await assertHasFix('''
88+
class A {
89+
A(int p1, int p2, {required int p3});
90+
}
91+
class B extends A {
92+
B(super.p1) : super(0, p3: 0);
93+
}
94+
''');
95+
}
96+
}
2197

2298
@reflectiveTest
2399
class AddSuperConstructorInvocationTest_language215 extends FixProcessorTest

0 commit comments

Comments
 (0)