Skip to content

Commit 1ce143c

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Issue 42278. Null-nullify types after function expression inference, not the context type.
Bug: #42278 Change-Id: I40abcb6e7e97ef4f3993da65a21dffbdbc1f483a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/151000 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent ccc39d5 commit 1ce143c

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:analyzer/dart/element/element.dart';
77
import 'package:analyzer/dart/element/type.dart';
88
import 'package:analyzer/dart/element/type_provider.dart';
99
import 'package:analyzer/src/dart/element/type.dart';
10+
import 'package:analyzer/src/dart/element/type_demotion.dart';
1011
import 'package:analyzer/src/generated/resolver.dart';
1112
import 'package:analyzer/src/generated/type_system.dart';
1213
import 'package:meta/meta.dart';
@@ -97,7 +98,7 @@ class BodyInferenceContext {
9798
_typeSystem.isSubtypeOf2(actualReturnedType, contextType)) {
9899
clampedReturnedType = actualReturnedType;
99100
} else {
100-
clampedReturnedType = contextType;
101+
clampedReturnedType = nonNullifyType(_typeSystem, contextType);
101102
}
102103

103104
if (_isGenerator) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ class FunctionExpressionResolver {
5151
}
5252

5353
var contextType = InferenceContext.getContext(node);
54-
contextType = nonNullifyType(_typeSystem, contextType);
55-
5654
if (contextType is FunctionType) {
5755
contextType = _matchFunctionTypeParameters(
5856
node.typeParameters,
@@ -110,6 +108,8 @@ class FunctionExpressionResolver {
110108
if (_migrationResolutionHooks != null) {
111109
inferredType = _migrationResolutionHooks
112110
.modifyInferredParameterType(p, inferredType);
111+
} else {
112+
inferredType = nonNullifyType(_typeSystem, inferredType);
113113
}
114114
if (!inferredType.isDynamic) {
115115
p.type = inferredType;

pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,38 @@ void f() {
429429
_assertReturnType('(a) {', 'int');
430430
}
431431

432+
test_contextFunctionType_nonNullify_returnType_takeActual() async {
433+
newFile('/test/lib/a.dart', content: r'''
434+
// @dart = 2.7
435+
436+
void foo(int Function() x) {}
437+
''');
438+
await assertNoErrorsInCode('''
439+
import 'a.dart';
440+
441+
void test(int? a) {
442+
foo(() => a);
443+
}
444+
''');
445+
_assertReturnType('() => a', 'int?');
446+
}
447+
448+
test_contextFunctionType_nonNullify_returnType_takeContext() async {
449+
newFile('/test/lib/a.dart', content: r'''
450+
// @dart = 2.7
451+
452+
void foo(int Function() x) {}
453+
''');
454+
await assertNoErrorsInCode('''
455+
import 'a.dart';
456+
457+
void test(dynamic a) {
458+
foo(() => a);
459+
}
460+
''');
461+
_assertReturnType('() => a', 'int');
462+
}
463+
432464
test_contextFunctionType_returnType_async_blockBody_objectQ() async {
433465
await assertNoErrorsInCode('''
434466
T foo<T>() => throw 0;

0 commit comments

Comments
 (0)