Skip to content

Commit e6eafe2

Browse files
srawlinscommit-bot@chromium.org
authored andcommitted
Fix strict inference on overriding methods and setters.
See the change to the spec: dart-lang/language#595 Change-Id: I5aeb20eb175f7018ecc99f398ea4d463b1e7874e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118920 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 5b33bad commit e6eafe2

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,18 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
384384
void visitMethodDeclaration(MethodDeclaration node) {
385385
bool wasInDeprecatedMember = _inDeprecatedMember;
386386
ExecutableElement element = node.declaredElement;
387+
bool elementIsOverride() {
388+
if (element is ClassMemberElement) {
389+
Name name = new Name(_currentLibrary.source.uri, element.name);
390+
Element enclosingElement = element.enclosingElement;
391+
if (enclosingElement is ClassElement) {
392+
InterfaceType classType = enclosingElement.thisType;
393+
return _inheritanceManager.getOverridden(classType, name) != null;
394+
}
395+
}
396+
return false;
397+
}
398+
387399
if (element != null && element.hasDeprecated) {
388400
_inDeprecatedMember = true;
389401
}
@@ -392,7 +404,9 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
392404
//checkForOverridingPrivateMember(node);
393405
_checkForMissingReturn(node.returnType, node.body, element, node);
394406
_checkForUnnecessaryNoSuchMethod(node);
395-
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
407+
if (_strictInference && !node.isSetter && !elementIsOverride()) {
408+
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
409+
}
396410
_checkStrictInferenceInParameters(node.parameters);
397411
super.visitMethodDeclaration(node);
398412
} finally {

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,38 @@ class C {
6060
''', [error(HintCode.INFERENCE_FAILURE_ON_FUNCTION_RETURN_TYPE, 12, 9)]);
6161
}
6262

63+
test_classInstanceMethod_overriding() async {
64+
await assertNoErrorsInCode(r'''
65+
class C {
66+
int f() => 7;
67+
}
68+
69+
class D extends C {
70+
f() => 9;
71+
}
72+
73+
class E implements C {
74+
f() => 9;
75+
}
76+
77+
class F with C {
78+
f() => 9;
79+
}
80+
81+
mixin M on C {
82+
f() => 9;
83+
}
84+
85+
mixin N {
86+
int g() => 7;
87+
}
88+
89+
class G with N {
90+
g() => 9;
91+
}
92+
''');
93+
}
94+
6395
test_classInstanceMethod_withReturnType() async {
6496
await assertNoErrorsInCode(r'''
6597
class C {
@@ -77,11 +109,11 @@ class C {
77109
}
78110

79111
test_classInstanceSetter() async {
80-
await assertErrorsInCode(r'''
112+
await assertNoErrorsInCode(r'''
81113
class C {
82114
set f(int x) => print(x);
83115
}
84-
''', [error(HintCode.INFERENCE_FAILURE_ON_FUNCTION_RETURN_TYPE, 12, 25)]);
116+
''');
85117
}
86118

87119
test_classStaticMethod() async {

0 commit comments

Comments
 (0)