Skip to content

Commit 8b37db6

Browse files
committed
analyzer: Do not report parameter as unused if used via super-parameter
Fixes #55720 The fix is simple; the existing tests are a little untidy so I tried to make them minimal tests, and added a few test cases. In a follow up, I'd like to clean up the test case names because some have '_parameter' and some have '_optionalParameter', and then the named vs positional thing, all coupled with alphabetical test cases, makes them hard to grok. Change-Id: I2fff336563ac6078597d6435392ceef708e8ad03 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/465240 Reviewed-by: Paul Berry <[email protected]>
1 parent 49429c0 commit 8b37db6

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ class GatherUsedLocalElementsVisitor extends RecursiveAstVisitor<void> {
110110
}
111111
}
112112

113+
for (var parameter in node.parameters.parameters) {
114+
if (parameter is SuperFormalParameter) {
115+
usedElements.addElement(
116+
parameter.declaredFragment!.element.superConstructorParameter,
117+
);
118+
}
119+
}
120+
113121
super.visitConstructorDeclaration(node);
114122
}
115123

pkg/analyzer/test/src/diagnostics/unused_element_test.dart

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,24 +1919,16 @@ f() => A()._m();
19191919
test_optionalParameter_notUsed_overrideRequired() async {
19201920
await assertNoErrorsInCode(r'''
19211921
class A {
1922-
const A({
1923-
required this.a,
1924-
required this.b,
1925-
});
1922+
A({required this.a, required this.b});
19261923
final String a;
19271924
final String b;
19281925
}
19291926
19301927
class _B extends A {
1931-
const _B({
1932-
required super.a,
1933-
super.b = 'b',
1934-
});
1928+
_B({required super.a, super.b = 'b'});
19351929
}
19361930
1937-
const foo = _B(
1938-
a: 'a',
1939-
);
1931+
var foo = _B(a: 'a');
19401932
''');
19411933
}
19421934

@@ -2058,14 +2050,30 @@ f() => _A.named(f: 0);
20582050
test_parameter_optionalNamed_fieldFormal_isUsed_superInvocation() async {
20592051
await assertNoErrorsInCode(r'''
20602052
class _A {
2061-
final int e;
2062-
final int? f;
2063-
_A(this.e, {this.f});
2053+
final int? e;
2054+
_A({this.e});
20642055
}
20652056
2066-
class B extends _A {
2067-
B(int e) : super(e, f: 1);
2057+
class _B extends _A {
2058+
_B([int? e]) : super(e: 1);
2059+
}
2060+
2061+
var b = _B(1);
2062+
''');
2063+
}
2064+
2065+
test_parameter_optionalNamed_fieldFormal_isUsed_superParameter() async {
2066+
await assertNoErrorsInCode(r'''
2067+
class _A {
2068+
final int? e;
2069+
_A({this.e});
2070+
}
2071+
2072+
class _B extends _A {
2073+
_B({super.e});
20682074
}
2075+
2076+
var b = _B(e: 2);
20692077
''');
20702078
}
20712079

@@ -2132,14 +2140,30 @@ f() => _A.named(0);
21322140
test_parameter_optionalPositional_fieldFormal_isUsed_superInvocation() async {
21332141
await assertNoErrorsInCode(r'''
21342142
class _A {
2135-
final int e;
2136-
final int? f;
2137-
_A(this.e, [this.f]);
2143+
final int? e;
2144+
_A([this.e]);
21382145
}
21392146
2140-
class B extends _A {
2141-
B(int e) : super(e, 1);
2147+
class _B extends _A {
2148+
_B(int e) : super(e);
21422149
}
2150+
2151+
var b = _B(1);
2152+
''');
2153+
}
2154+
2155+
test_parameter_optionalPositional_fieldFormal_isUsed_superParameter() async {
2156+
await assertNoErrorsInCode(r'''
2157+
class _A {
2158+
final int? e;
2159+
_A([this.e]);
2160+
}
2161+
2162+
class _B extends _A {
2163+
_B(super.e);
2164+
}
2165+
2166+
var b = _B(2);
21432167
''');
21442168
}
21452169

0 commit comments

Comments
 (0)