Skip to content

Commit 5951351

Browse files
srawlinscommit-bot@chromium.org
authored andcommitted
Do not report inference failure on untyped parameters of overridding methods
While in the area, refactored _hasNonVirtualAnnotation calls to reduce null checks. Change-Id: I74e3108e4cf1221cc1025d1283aacc1976757c09 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/203296 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 9f01e02 commit 5951351

File tree

2 files changed

+34
-23
lines changed

2 files changed

+34
-23
lines changed

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

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,12 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
440440
}
441441

442442
final overriddenElement = getOverriddenPropertyAccessor();
443-
if (_hasNonVirtualAnnotation(overriddenElement)) {
443+
if (overriddenElement != null &&
444+
_hasNonVirtualAnnotation(overriddenElement)) {
444445
_errorReporter.reportErrorForNode(
445446
HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
446447
field.name,
447-
[field.name, overriddenElement!.enclosingElement.name]);
448+
[field.name, overriddenElement.enclosingElement.name]);
448449
}
449450
if (!_invalidAccessVerifier._inTestDirectory) {
450451
_checkForAssignmentOfDoNotStore(field.initializer);
@@ -584,10 +585,6 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
584585

585586
Name name = Name(_currentLibrary.source.uri, element.name);
586587

587-
bool elementIsOverride() =>
588-
element is ClassMemberElement && enclosingElement is ClassElement
589-
? _inheritanceManager.getOverridden2(enclosingElement, name) != null
590-
: false;
591588
ExecutableElement? getConcreteOverriddenElement() =>
592589
element is ClassMemberElement && enclosingElement is ClassElement
593590
? _inheritanceManager.getMember2(enclosingElement, name,
@@ -610,21 +607,29 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
610607
_mustCallSuperVerifier.checkMethodDeclaration(node);
611608
_checkForUnnecessaryNoSuchMethod(node);
612609

613-
if (!node.isSetter && !elementIsOverride()) {
610+
var elementIsOverride = element is ClassMemberElement &&
611+
enclosingElement is ClassElement
612+
? _inheritanceManager.getOverridden2(enclosingElement, name) != null
613+
: false;
614+
615+
if (!node.isSetter && !elementIsOverride) {
614616
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
615617
}
616-
_checkStrictInferenceInParameters(node.parameters, body: node.body);
618+
if (!elementIsOverride) {
619+
_checkStrictInferenceInParameters(node.parameters, body: node.body);
620+
}
617621

618622
var overriddenElement = getConcreteOverriddenElement();
619623
if (overriddenElement == null && (node.isSetter || node.isGetter)) {
620624
overriddenElement = getOverriddenPropertyAccessor();
621625
}
622626

623-
if (_hasNonVirtualAnnotation(overriddenElement)) {
627+
if (overriddenElement != null &&
628+
_hasNonVirtualAnnotation(overriddenElement)) {
624629
_errorReporter.reportErrorForNode(
625630
HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
626631
node.name,
627-
[node.name, overriddenElement!.enclosingElement.name]);
632+
[node.name, overriddenElement.enclosingElement.name]);
628633
}
629634

630635
super.visitMethodDeclaration(node);
@@ -1739,10 +1744,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
17391744
return identifier?.name ?? '';
17401745
}
17411746

1742-
static bool _hasNonVirtualAnnotation(ExecutableElement? element) {
1743-
if (element == null) {
1744-
return false;
1745-
}
1747+
static bool _hasNonVirtualAnnotation(ExecutableElement element) {
17461748
if (element is PropertyAccessorElement && element.isSynthetic) {
17471749
return element.variable.hasNonVirtual;
17481750
}

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,22 +208,20 @@ class C {
208208
}
209209

210210
test_parameter_inOverridingMethod() async {
211-
await assertErrorsInCode(r'''
211+
await assertNoErrorsInCode(r'''
212212
class C {
213213
void fn(int a) => print(a);
214214
}
215215
216216
class D extends C {
217217
@override
218-
void fn(var a) => print(a);
218+
void fn(a) => print(a);
219219
}
220-
''', [
221-
error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 85, 5),
222-
]);
220+
''');
223221
}
224222

225223
test_parameter_inOverridingMethod_withDefault() async {
226-
await assertErrorsInCode(r'''
224+
await assertNoErrorsInCode(r'''
227225
class C {
228226
void fn([int a = 7]) => print(a);
229227
}
@@ -232,9 +230,7 @@ class D extends C {
232230
@override
233231
void fn([var a = 7]) => print(a);
234232
}
235-
''', [
236-
error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 92, 5),
237-
]);
233+
''');
238234
}
239235

240236
test_parameter_inOverridingMethod_withDefaultAndType() async {
@@ -263,6 +259,19 @@ class D extends C {
263259
''');
264260
}
265261

262+
test_parameter_inOverridingMethod_withVar() async {
263+
await assertNoErrorsInCode(r'''
264+
class C {
265+
void fn(int a) => print(a);
266+
}
267+
268+
class D extends C {
269+
@override
270+
void fn(var a) => print(a);
271+
}
272+
''');
273+
}
274+
266275
test_parameter_inTypedef_withoutType() async {
267276
await assertErrorsInCode(r'''
268277
typedef void cb(a);

0 commit comments

Comments
 (0)