Skip to content

Commit 1ce1c51

Browse files
authored
Port "Infer from annotated return type nodes before assigning contextual parameter types" (#1804)
1 parent cc551fb commit 1ce1c51

File tree

3 files changed

+27
-91
lines changed

3 files changed

+27
-91
lines changed

internal/checker/checker.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9827,7 +9827,7 @@ func (c *Checker) contextuallyCheckFunctionExpressionOrObjectLiteralMethod(node
98279827
inferenceContext := c.getInferenceContext(node)
98289828
var instantiatedContextualSignature *Signature
98299829
if checkMode&CheckModeInferential != 0 {
9830-
c.inferFromAnnotatedParameters(signature, contextualSignature, inferenceContext)
9830+
c.inferFromAnnotatedParametersAndReturn(signature, contextualSignature, inferenceContext)
98319831
restType := c.getEffectiveRestType(contextualSignature)
98329832
if restType != nil && restType.flags&TypeFlagsTypeParameter != 0 {
98339833
instantiatedContextualSignature = c.instantiateSignature(contextualSignature, inferenceContext.nonFixingMapper)
@@ -9848,7 +9848,7 @@ func (c *Checker) contextuallyCheckFunctionExpressionOrObjectLiteralMethod(node
98489848
} else if contextualSignature != nil && node.TypeParameters() == nil && len(contextualSignature.parameters) > len(node.Parameters()) {
98499849
inferenceContext := c.getInferenceContext(node)
98509850
if checkMode&CheckModeInferential != 0 {
9851-
c.inferFromAnnotatedParameters(signature, contextualSignature, inferenceContext)
9851+
c.inferFromAnnotatedParametersAndReturn(signature, contextualSignature, inferenceContext)
98529852
}
98539853
}
98549854
if contextualSignature != nil && c.getReturnTypeFromAnnotation(node) == nil && signature.resolvedReturnType == nil {
@@ -9895,7 +9895,7 @@ func (c *Checker) checkFunctionExpressionOrObjectLiteralMethodDeferred(node *ast
98959895
}
98969896
}
98979897

9898-
func (c *Checker) inferFromAnnotatedParameters(sig *Signature, context *Signature, inferenceContext *InferenceContext) {
9898+
func (c *Checker) inferFromAnnotatedParametersAndReturn(sig *Signature, context *Signature, inferenceContext *InferenceContext) {
98999899
length := len(sig.parameters) - core.IfElse(signatureHasRestParameter(sig), 1, 0)
99009900
for i := range length {
99019901
declaration := sig.parameters[i].ValueDeclaration
@@ -9906,6 +9906,13 @@ func (c *Checker) inferFromAnnotatedParameters(sig *Signature, context *Signatur
99069906
c.inferTypes(inferenceContext.inferences, source, target, InferencePriorityNone, false)
99079907
}
99089908
}
9909+
if declaration := sig.Declaration(); declaration != nil {
9910+
if returnTypeNode := declaration.Type(); returnTypeNode != nil {
9911+
source := c.getTypeFromTypeNode(returnTypeNode)
9912+
target := c.getReturnTypeOfSignature(context)
9913+
c.inferTypes(inferenceContext.inferences, source, target, InferencePriorityNone, false)
9914+
}
9915+
}
99099916
}
99109917

99119918
// Return the contextual signature for a given expression node. A contextual type provides a

testdata/baselines/reference/submodule/compiler/inferFromAnnotatedReturn1.types

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ declare function test<T>(cb: (arg: T) => T): T;
77
>arg : T
88

99
const res1 = test((arg): number => 1); // ok
10-
>res1 : unknown
11-
>test((arg): number => 1) : unknown
10+
>res1 : number
11+
>test((arg): number => 1) : number
1212
>test : <T>(cb: (arg: T) => T) => T
13-
>(arg): number => 1 : (arg: unknown) => number
14-
>arg : unknown
13+
>(arg): number => 1 : (arg: number) => number
14+
>arg : number
1515
>1 : 1
1616

1717
const res2 = test((arg): number => 'foo'); // error
18-
>res2 : unknown
19-
>test((arg): number => 'foo') : unknown
18+
>res2 : number
19+
>test((arg): number => 'foo') : number
2020
>test : <T>(cb: (arg: T) => T) => T
21-
>(arg): number => 'foo' : (arg: unknown) => number
22-
>arg : unknown
21+
>(arg): number => 'foo' : (arg: number) => number
22+
>arg : number
2323
>'foo' : "foo"
2424

2525
export declare function linkedSignal<S, D>(options: {
@@ -36,20 +36,20 @@ export declare function linkedSignal<S, D>(options: {
3636
}): D;
3737

3838
const signal = linkedSignal({
39-
>signal : unknown
40-
>linkedSignal({ source: () => 3, computation: (s): number => 3,}) : unknown
39+
>signal : number
40+
>linkedSignal({ source: () => 3, computation: (s): number => 3,}) : number
4141
>linkedSignal : <S, D>(options: { source: () => S; computation: (source: NoInfer<D>) => D; }) => D
42-
>{ source: () => 3, computation: (s): number => 3,} : { source: () => number; computation: (s: unknown) => number; }
42+
>{ source: () => 3, computation: (s): number => 3,} : { source: () => number; computation: (s: number) => number; }
4343

4444
source: () => 3,
4545
>source : () => number
4646
>() => 3 : () => number
4747
>3 : 3
4848

4949
computation: (s): number => 3,
50-
>computation : (s: unknown) => number
51-
>(s): number => 3 : (s: unknown) => number
52-
>s : unknown
50+
>computation : (s: number) => number
51+
>(s): number => 3 : (s: number) => number
52+
>s : number
5353
>3 : 3
5454

5555
});
@@ -66,10 +66,10 @@ class Foo<T, R> {
6666
}
6767

6868
const _1 = new Foo((name: string, { x }): { name: string; x: number } => ({
69-
>_1 : Foo<string, unknown>
70-
>new Foo((name: string, { x }): { name: string; x: number } => ({ name, x,})) : Foo<string, unknown>
69+
>_1 : Foo<string, { name: string; x: number; }>
70+
>new Foo((name: string, { x }): { name: string; x: number } => ({ name, x,})) : Foo<string, { name: string; x: number; }>
7171
>Foo : typeof Foo
72-
>(name: string, { x }): { name: string; x: number } => ({ name, x,}) : (name: string, { x }: { x: number; other: unknown; }) => { name: string; x: number; }
72+
>(name: string, { x }): { name: string; x: number } => ({ name, x,}) : (name: string, { x }: { x: number; other: NoInfer<{ name: string; x: number; }>; }) => { name: string; x: number; }
7373
>name : string
7474
>x : number
7575
>name : string

testdata/baselines/reference/submodule/compiler/inferFromAnnotatedReturn1.types.diff

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)