Skip to content

Commit 28d77be

Browse files
asashourCommit Bot
authored andcommitted
@visibleForOverriding should not hint on calling super.
Fixes #48626 Change-Id: Ie0b7d1e8f92ab5ecfc03e60635ab89ea4b99f0d3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239432 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 29f9b20 commit 28d77be

File tree

2 files changed

+155
-2
lines changed

2 files changed

+155
-2
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,8 +1962,22 @@ class _InvalidAccessVerifier {
19621962
}
19631963

19641964
if (hasVisibleForOverriding) {
1965-
_errorReporter.reportErrorForNode(
1966-
HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, node, [name]);
1965+
var parent = node.parent;
1966+
var validOverride = false;
1967+
if (parent is MethodInvocation && parent.target is SuperExpression ||
1968+
parent is PropertyAccess && parent.target is SuperExpression) {
1969+
var methodDeclaration =
1970+
grandparent?.thisOrAncestorOfType<MethodDeclaration>();
1971+
if (methodDeclaration?.name.token.value() == identifier.token.value()) {
1972+
validOverride = true;
1973+
}
1974+
}
1975+
if (!validOverride) {
1976+
_errorReporter.reportErrorForNode(
1977+
HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER,
1978+
node,
1979+
[name]);
1980+
}
19671981
}
19681982
}
19691983

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

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,125 @@ class Child extends Parent {
8888
''');
8989
}
9090

91+
test_getter() async {
92+
newFile2('$testPackageLibPath/a.dart', '''
93+
import 'package:meta/meta.dart';
94+
95+
class A {
96+
@visibleForOverriding
97+
int get g => 0;
98+
}
99+
''');
100+
101+
await assertErrorsInCode('''
102+
import 'a.dart';
103+
104+
class B {
105+
int m(A a) {
106+
return a.g;
107+
}
108+
}
109+
''', [
110+
error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 56, 1),
111+
]);
112+
}
113+
114+
test_overriding_getter() async {
115+
newFile2('$testPackageLibPath/a.dart', '''
116+
import 'package:meta/meta.dart';
117+
118+
class A {
119+
@visibleForOverriding
120+
int get g => 0;
121+
}
122+
''');
123+
124+
await assertErrorsInCode('''
125+
import 'a.dart';
126+
127+
class B extends A {
128+
@override
129+
int get g => super.g + 1;
130+
131+
int get x => super.g + 1;
132+
}
133+
''', [
134+
error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 100, 1),
135+
]);
136+
}
137+
138+
test_overriding_methodInvocation() async {
139+
newFile2('$testPackageLibPath/a.dart', '''
140+
import 'package:meta/meta.dart';
141+
142+
class A {
143+
@visibleForOverriding
144+
void m() {}
145+
}
146+
''');
147+
148+
await assertErrorsInCode('''
149+
import 'a.dart';
150+
151+
class B extends A {
152+
@override
153+
void m() => super.m();
154+
155+
void x() => super.m();
156+
}
157+
''', [
158+
error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 96, 1),
159+
]);
160+
}
161+
162+
test_overriding_operator() async {
163+
newFile2('$testPackageLibPath/a.dart', '''
164+
import 'package:meta/meta.dart';
165+
166+
class A {
167+
@visibleForOverriding
168+
operator >(A other) => true;
169+
}
170+
''');
171+
172+
await assertNoErrorsInCode('''
173+
import 'a.dart';
174+
175+
class B extends A {
176+
@override
177+
operator >(A other) => super > other;
178+
}
179+
''');
180+
}
181+
182+
test_overriding_setter() async {
183+
newFile2('$testPackageLibPath/a.dart', '''
184+
import 'package:meta/meta.dart';
185+
186+
class A {
187+
@visibleForOverriding
188+
set s(int i) {}
189+
}
190+
''');
191+
192+
await assertErrorsInCode('''
193+
import 'a.dart';
194+
195+
class B extends A {
196+
@override
197+
set s(int i) => super.s = i;
198+
199+
set x(int i) => super.s = i;
200+
}
201+
''', [
202+
error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 106, 1),
203+
]);
204+
}
205+
91206
test_sameLibrary() async {
92207
await assertNoErrorsInCode('''
93208
import 'package:meta/meta.dart';
209+
94210
class Parent {
95211
@visibleForOverriding
96212
void foo() {}
@@ -103,4 +219,27 @@ class Child extends Parent {
103219
}
104220
''');
105221
}
222+
223+
test_setter() async {
224+
newFile2('$testPackageLibPath/a.dart', '''
225+
import 'package:meta/meta.dart';
226+
227+
class A {
228+
@visibleForOverriding
229+
set s(int i) {}
230+
}
231+
''');
232+
233+
await assertErrorsInCode('''
234+
import 'a.dart';
235+
236+
class B {
237+
void m(A a) {
238+
a.s = 1;
239+
}
240+
}
241+
''', [
242+
error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 50, 1),
243+
]);
244+
}
106245
}

0 commit comments

Comments
 (0)