Skip to content

Commit fefd2dc

Browse files
srawlinsCommit Queue
authored andcommitted
Support primary constructors in avoid_unused_constructor_parameters
Fixes #62505 Change-Id: Ic25a525ade7ac454a09ff1934ee4baec95636607 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/475681 Reviewed-by: Phil Quitslund <pquitslund@google.com> Commit-Queue: Samuel Rawlins <srawlins@google.com>
1 parent 606975e commit fefd2dc

2 files changed

Lines changed: 77 additions & 7 deletions

File tree

pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@ class AvoidUnusedConstructorParameters extends AnalysisRule {
3434
) {
3535
var visitor = _Visitor(this);
3636
registry.addConstructorDeclaration(this, visitor);
37+
registry.addPrimaryConstructorDeclaration(this, visitor);
3738
}
3839
}
3940

4041
class _ConstructorVisitor extends RecursiveAstVisitor<void> {
41-
final ConstructorDeclaration element;
42+
final FormalParameterList parameterList;
4243
final Set<FormalParameter> unusedParameters;
4344

44-
_ConstructorVisitor(this.element)
45-
: unusedParameters = element.parameters.parameters.where((p) {
45+
_ConstructorVisitor(this.parameterList)
46+
: unusedParameters = parameterList.parameters.where((p) {
4647
var element = p.declaredFragment?.element;
4748
return element != null &&
4849
element is! FieldFormalParameterElement &&
@@ -70,10 +71,33 @@ class _Visitor extends SimpleAstVisitor<void> {
7071
if (node.redirectedConstructor != null) return;
7172
if (node.externalKeyword != null) return;
7273

73-
var constructorVisitor = _ConstructorVisitor(node);
74-
node.body.visitChildren(constructorVisitor);
75-
for (var i in node.initializers) {
76-
i.visitChildren(constructorVisitor);
74+
_checkConstructorParameters(
75+
parameterList: node.parameters,
76+
initializers: node.initializers,
77+
body: node.body,
78+
);
79+
}
80+
81+
@override
82+
void visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
83+
_checkConstructorParameters(
84+
parameterList: node.formalParameters,
85+
initializers: node.body?.initializers,
86+
body: node.body?.body,
87+
);
88+
}
89+
90+
void _checkConstructorParameters({
91+
required FormalParameterList parameterList,
92+
required List<ConstructorInitializer>? initializers,
93+
required FunctionBody? body,
94+
}) {
95+
var constructorVisitor = _ConstructorVisitor(parameterList);
96+
body?.visitChildren(constructorVisitor);
97+
if (initializers != null) {
98+
for (var i in initializers) {
99+
i.visitChildren(constructorVisitor);
100+
}
77101
}
78102

79103
for (var parameter in constructorVisitor.unusedParameters) {

pkg/linter/test/rules/avoid_unused_constructor_parameters_test.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ class B extends A {
142142
''');
143143
}
144144

145+
test_unused_declaring_primary() async {
146+
await assertNoDiagnostics(r'''
147+
class C([final int p = 0]);
148+
''');
149+
}
150+
145151
test_unused_optionalPositional() async {
146152
await assertDiagnostics(
147153
r'''
@@ -153,6 +159,15 @@ class C {
153159
);
154160
}
155161

162+
test_unused_optionalPositional_primary() async {
163+
await assertDiagnostics(
164+
r'''
165+
class C([int p = 0]);
166+
''',
167+
[lint(9, 9)],
168+
);
169+
}
170+
156171
test_unused_requiredPositional() async {
157172
await assertDiagnostics(
158173
r'''
@@ -174,6 +189,16 @@ class C {
174189
''');
175190
}
176191

192+
test_usedInConstructorBody_primary() async {
193+
await assertNoDiagnostics(r'''
194+
class C({int p = 0}) {
195+
this {
196+
p;
197+
}
198+
}
199+
''');
200+
}
201+
177202
test_usedInConstructorInitializer() async {
178203
await assertNoDiagnostics(r'''
179204
class C {
@@ -183,6 +208,14 @@ class C {
183208
''');
184209
}
185210

211+
test_usedInConstructorInitializer_primary() async {
212+
await assertNoDiagnostics(r'''
213+
class C({int p = 0}) {
214+
this : assert(p > 0);
215+
}
216+
''');
217+
}
218+
186219
test_usedInRedirectingInitializer() async {
187220
await assertNoDiagnostics(r'''
188221
class C {
@@ -206,6 +239,19 @@ class D extends C {
206239
''');
207240
}
208241

242+
test_usedInSuperInitializer_primary() async {
243+
await assertNoDiagnostics(r'''
244+
class C {
245+
int p;
246+
C(this.p);
247+
}
248+
249+
class D(int p) extends C {
250+
this : super(p);
251+
}
252+
''');
253+
}
254+
209255
test_wildcardParam() async {
210256
await assertNoDiagnostics(r'''
211257
class C {

0 commit comments

Comments
 (0)