Skip to content

Commit 215335b

Browse files
committed
Defer checking call and new expressions with context sensitive arguments
1 parent 7956c00 commit 215335b

5 files changed

Lines changed: 707 additions & 3 deletions

File tree

src/compiler/checker.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21141,6 +21141,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2114121141
const { expression } = node as JsxExpression;
2114221142
return !!expression && isContextSensitive(expression);
2114321143
}
21144+
case SyntaxKind.NewExpression:
21145+
case SyntaxKind.CallExpression:
21146+
return some((node as NewExpression | CallExpression).arguments, isContextSensitive);
2114421147
}
2114521148

2114621149
return false;
@@ -36999,7 +37002,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3699937002
// use the resolvingSignature singleton to indicate that we deferred processing. This result will be
3700037003
// propagated out and eventually turned into silentNeverType (a type that is assignable to anything and
3700137004
// from which we never make inferences).
37002-
if (checkMode & CheckMode.SkipGenericFunctions && !node.typeArguments && callSignatures.some(isGenericFunctionReturningFunction)) {
37005+
if (!node.typeArguments && (checkMode & CheckMode.SkipGenericFunctions && callSignatures.some(isGenericFunctionReturningFunction) || checkMode & CheckMode.SkipContextSensitive && isContextSensitive(node))) {
3700337006
skippedGenericFunction(node, checkMode);
3700437007
return resolvingSignature;
3700537008
}
@@ -37054,6 +37057,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3705437057
return resolveUntypedCall(node);
3705537058
}
3705637059

37060+
if (!node.typeArguments && checkMode & CheckMode.SkipContextSensitive && isContextSensitive(node)) {
37061+
skippedGenericFunction(node, checkMode);
37062+
return resolvingSignature;
37063+
}
37064+
3705737065
// Technically, this signatures list may be incomplete. We are taking the apparent type,
3705837066
// but we are not including construct signatures that may have been added to the Object or
3705937067
// Function interface, since they have none by default. This is a bit of a leap of faith
Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
//// [tests/cases/compiler/contextSensitiveCallNewArguments1.ts] ////
2+
3+
=== contextSensitiveCallNewArguments1.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/62380
5+
6+
class Foo<T> {
7+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
8+
>T : Symbol(T, Decl(contextSensitiveCallNewArguments1.ts, 2, 10))
9+
10+
constructor(public inner: T) {}
11+
>inner : Symbol(Foo.inner, Decl(contextSensitiveCallNewArguments1.ts, 3, 14))
12+
>T : Symbol(T, Decl(contextSensitiveCallNewArguments1.ts, 2, 10))
13+
}
14+
15+
class BarClass<T> {
16+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
17+
>T : Symbol(T, Decl(contextSensitiveCallNewArguments1.ts, 6, 15))
18+
19+
constructor(public accessor: (state: T) => boolean) {}
20+
>accessor : Symbol(BarClass.accessor, Decl(contextSensitiveCallNewArguments1.ts, 7, 14))
21+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 7, 32))
22+
>T : Symbol(T, Decl(contextSensitiveCallNewArguments1.ts, 6, 15))
23+
}
24+
25+
{
26+
class Container<C, F> {
27+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 10, 1))
28+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 11, 18))
29+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 11, 20))
30+
31+
constructor(
32+
public ctx: C,
33+
>ctx : Symbol(Container.ctx, Decl(contextSensitiveCallNewArguments1.ts, 12, 16))
34+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 11, 18))
35+
36+
public fooFactory: (ctx: C) => F,
37+
>fooFactory : Symbol(Container.fooFactory, Decl(contextSensitiveCallNewArguments1.ts, 13, 20))
38+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 14, 26))
39+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 11, 18))
40+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 11, 20))
41+
42+
public bars: BarClass<F>[],
43+
>bars : Symbol(Container.bars, Decl(contextSensitiveCallNewArguments1.ts, 14, 39))
44+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
45+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 11, 20))
46+
47+
) {}
48+
}
49+
50+
const container = new Container(42, (ctx) => new Foo({ answer: ctx }), [
51+
>container : Symbol(container, Decl(contextSensitiveCallNewArguments1.ts, 19, 7))
52+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 10, 1))
53+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 19, 39))
54+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
55+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 19, 56))
56+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 19, 39))
57+
58+
new BarClass((state) => true),
59+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
60+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 20, 18))
61+
62+
]);
63+
}
64+
65+
{
66+
class Container<C, F> {
67+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 24, 1))
68+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 25, 18))
69+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 25, 20))
70+
71+
constructor(
72+
public ctx: C,
73+
>ctx : Symbol(Container.ctx, Decl(contextSensitiveCallNewArguments1.ts, 26, 16))
74+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 25, 18))
75+
76+
public fooFactory: (ctx: C) => F,
77+
>fooFactory : Symbol(Container.fooFactory, Decl(contextSensitiveCallNewArguments1.ts, 27, 20))
78+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 28, 26))
79+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 25, 18))
80+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 25, 20))
81+
82+
public bar: BarClass<F>,
83+
>bar : Symbol(Container.bar, Decl(contextSensitiveCallNewArguments1.ts, 28, 39))
84+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
85+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 25, 20))
86+
87+
) {}
88+
}
89+
90+
const containerWithoutAnnotation = new Container(
91+
>containerWithoutAnnotation : Symbol(containerWithoutAnnotation, Decl(contextSensitiveCallNewArguments1.ts, 33, 7))
92+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 24, 1))
93+
94+
42,
95+
(ctx) => new Foo({ answer: ctx }),
96+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 35, 5))
97+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
98+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 35, 22))
99+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 35, 5))
100+
101+
new BarClass((state) => true),
102+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
103+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 36, 18))
104+
105+
);
106+
107+
const containerWithAnnotation = new Container(
108+
>containerWithAnnotation : Symbol(containerWithAnnotation, Decl(contextSensitiveCallNewArguments1.ts, 39, 7))
109+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 24, 1))
110+
111+
42,
112+
(ctx: number) => new Foo({ answer: ctx }),
113+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 41, 5))
114+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
115+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 41, 30))
116+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 41, 5))
117+
118+
new BarClass((state) => true),
119+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
120+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 42, 18))
121+
122+
);
123+
}
124+
125+
{
126+
class Container<C, F> {
127+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 46, 1))
128+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 47, 18))
129+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 47, 20))
130+
131+
constructor(
132+
public ctx: C,
133+
>ctx : Symbol(Container.ctx, Decl(contextSensitiveCallNewArguments1.ts, 48, 16))
134+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 47, 18))
135+
136+
public fooFactory: (ctx: C) => F,
137+
>fooFactory : Symbol(Container.fooFactory, Decl(contextSensitiveCallNewArguments1.ts, 49, 20))
138+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 50, 26))
139+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 47, 18))
140+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 47, 20))
141+
142+
public barFactory: () => BarClass<F>,
143+
>barFactory : Symbol(Container.barFactory, Decl(contextSensitiveCallNewArguments1.ts, 50, 39))
144+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
145+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 47, 20))
146+
147+
) {}
148+
}
149+
150+
const container = new Container(
151+
>container : Symbol(container, Decl(contextSensitiveCallNewArguments1.ts, 55, 7))
152+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 46, 1))
153+
154+
42,
155+
(ctx) => new Foo({ answer: ctx }),
156+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 57, 5))
157+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
158+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 57, 22))
159+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 57, 5))
160+
161+
() => new BarClass((state) => true),
162+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
163+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 58, 24))
164+
165+
);
166+
}
167+
168+
{
169+
class Container<C, F> {
170+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 62, 1))
171+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 63, 18))
172+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 63, 20))
173+
174+
constructor(
175+
public ctx: C,
176+
>ctx : Symbol(Container.ctx, Decl(contextSensitiveCallNewArguments1.ts, 64, 16))
177+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 63, 18))
178+
179+
public fooFactory: (ctx: C) => F,
180+
>fooFactory : Symbol(Container.fooFactory, Decl(contextSensitiveCallNewArguments1.ts, 65, 20))
181+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 66, 26))
182+
>C : Symbol(C, Decl(contextSensitiveCallNewArguments1.ts, 63, 18))
183+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 63, 20))
184+
185+
public barFactory: (dummy: never) => BarClass<F>,
186+
>barFactory : Symbol(Container.barFactory, Decl(contextSensitiveCallNewArguments1.ts, 66, 39))
187+
>dummy : Symbol(dummy, Decl(contextSensitiveCallNewArguments1.ts, 67, 26))
188+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
189+
>F : Symbol(F, Decl(contextSensitiveCallNewArguments1.ts, 63, 20))
190+
191+
) {}
192+
}
193+
194+
const containerWithDummy = new Container(
195+
>containerWithDummy : Symbol(containerWithDummy, Decl(contextSensitiveCallNewArguments1.ts, 71, 7))
196+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 62, 1))
197+
198+
42,
199+
(ctx) => new Foo({ answer: ctx }),
200+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 73, 5))
201+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
202+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 73, 22))
203+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 73, 5))
204+
205+
(dummy) => new BarClass((state) => true),
206+
>dummy : Symbol(dummy, Decl(contextSensitiveCallNewArguments1.ts, 74, 5))
207+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
208+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 74, 29))
209+
210+
);
211+
212+
const containerWithWrongArity = new Container(
213+
>containerWithWrongArity : Symbol(containerWithWrongArity, Decl(contextSensitiveCallNewArguments1.ts, 77, 7))
214+
>Container : Symbol(Container, Decl(contextSensitiveCallNewArguments1.ts, 62, 1))
215+
216+
42,
217+
(ctx) => new Foo({ answer: ctx }),
218+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 79, 5))
219+
>Foo : Symbol(Foo, Decl(contextSensitiveCallNewArguments1.ts, 0, 0))
220+
>answer : Symbol(answer, Decl(contextSensitiveCallNewArguments1.ts, 79, 22))
221+
>ctx : Symbol(ctx, Decl(contextSensitiveCallNewArguments1.ts, 79, 5))
222+
223+
() => new BarClass((state) => true),
224+
>BarClass : Symbol(BarClass, Decl(contextSensitiveCallNewArguments1.ts, 4, 1))
225+
>state : Symbol(state, Decl(contextSensitiveCallNewArguments1.ts, 80, 24))
226+
227+
);
228+
}
229+

0 commit comments

Comments
 (0)