Skip to content

Commit 41e4139

Browse files
authored
Only used cached undefined contextual type for requests with no flags (#52224)
1 parent d6de73b commit 41e4139

File tree

5 files changed

+165
-1
lines changed

5 files changed

+165
-1
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28842,7 +28842,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2884228842
}
2884328843
const index = findContextualNode(node);
2884428844
if (index >= 0) {
28845-
return contextualTypes[index];
28845+
const cached = contextualTypes[index];
28846+
if (cached || !contextFlags) return cached;
2884628847
}
2884728848
const { parent } = node;
2884828849
switch (parent.kind) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//// [cachedContextualTypes.ts]
2+
// Repro from #52198
3+
4+
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
5+
6+
export interface IMenuWorkbenchToolBarOptions {
7+
toolbarOptions: {
8+
foo(bar: string): string
9+
};
10+
}
11+
12+
class MenuWorkbenchToolBar {
13+
constructor(
14+
options: IMenuWorkbenchToolBarOptions | undefined,
15+
) { }
16+
}
17+
18+
createInstance(MenuWorkbenchToolBar, {
19+
toolbarOptions: {
20+
foo(bar) { return bar; }
21+
}
22+
});
23+
24+
25+
//// [cachedContextualTypes.js]
26+
"use strict";
27+
// Repro from #52198
28+
Object.defineProperty(exports, "__esModule", { value: true });
29+
var MenuWorkbenchToolBar = /** @class */ (function () {
30+
function MenuWorkbenchToolBar(options) {
31+
}
32+
return MenuWorkbenchToolBar;
33+
}());
34+
createInstance(MenuWorkbenchToolBar, {
35+
toolbarOptions: {
36+
foo: function (bar) { return bar; }
37+
}
38+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
=== tests/cases/compiler/cachedContextualTypes.ts ===
2+
// Repro from #52198
3+
4+
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
5+
>createInstance : Symbol(createInstance, Decl(cachedContextualTypes.ts, 0, 0))
6+
>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32))
7+
>args : Symbol(args, Decl(cachedContextualTypes.ts, 2, 50))
8+
>R : Symbol(R, Decl(cachedContextualTypes.ts, 2, 73))
9+
>InstanceType : Symbol(InstanceType, Decl(lib.es5.d.ts, --, --))
10+
>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32))
11+
>ctor : Symbol(ctor, Decl(cachedContextualTypes.ts, 2, 104))
12+
>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32))
13+
>args : Symbol(args, Decl(cachedContextualTypes.ts, 2, 115))
14+
>ConstructorParameters : Symbol(ConstructorParameters, Decl(lib.es5.d.ts, --, --))
15+
>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32))
16+
>R : Symbol(R, Decl(cachedContextualTypes.ts, 2, 73))
17+
18+
export interface IMenuWorkbenchToolBarOptions {
19+
>IMenuWorkbenchToolBarOptions : Symbol(IMenuWorkbenchToolBarOptions, Decl(cachedContextualTypes.ts, 2, 157))
20+
21+
toolbarOptions: {
22+
>toolbarOptions : Symbol(IMenuWorkbenchToolBarOptions.toolbarOptions, Decl(cachedContextualTypes.ts, 4, 47))
23+
24+
foo(bar: string): string
25+
>foo : Symbol(foo, Decl(cachedContextualTypes.ts, 5, 21))
26+
>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 6, 12))
27+
28+
};
29+
}
30+
31+
class MenuWorkbenchToolBar {
32+
>MenuWorkbenchToolBar : Symbol(MenuWorkbenchToolBar, Decl(cachedContextualTypes.ts, 8, 1))
33+
34+
constructor(
35+
options: IMenuWorkbenchToolBarOptions | undefined,
36+
>options : Symbol(options, Decl(cachedContextualTypes.ts, 11, 16))
37+
>IMenuWorkbenchToolBarOptions : Symbol(IMenuWorkbenchToolBarOptions, Decl(cachedContextualTypes.ts, 2, 157))
38+
39+
) { }
40+
}
41+
42+
createInstance(MenuWorkbenchToolBar, {
43+
>createInstance : Symbol(createInstance, Decl(cachedContextualTypes.ts, 0, 0))
44+
>MenuWorkbenchToolBar : Symbol(MenuWorkbenchToolBar, Decl(cachedContextualTypes.ts, 8, 1))
45+
46+
toolbarOptions: {
47+
>toolbarOptions : Symbol(toolbarOptions, Decl(cachedContextualTypes.ts, 16, 38))
48+
49+
foo(bar) { return bar; }
50+
>foo : Symbol(foo, Decl(cachedContextualTypes.ts, 17, 21))
51+
>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 18, 12))
52+
>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 18, 12))
53+
}
54+
});
55+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=== tests/cases/compiler/cachedContextualTypes.ts ===
2+
// Repro from #52198
3+
4+
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
5+
>createInstance : <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>) => R
6+
>args : any[]
7+
>ctor : Ctor
8+
>args : ConstructorParameters<Ctor>
9+
10+
export interface IMenuWorkbenchToolBarOptions {
11+
toolbarOptions: {
12+
>toolbarOptions : { foo(bar: string): string; }
13+
14+
foo(bar: string): string
15+
>foo : (bar: string) => string
16+
>bar : string
17+
18+
};
19+
}
20+
21+
class MenuWorkbenchToolBar {
22+
>MenuWorkbenchToolBar : MenuWorkbenchToolBar
23+
24+
constructor(
25+
options: IMenuWorkbenchToolBarOptions | undefined,
26+
>options : IMenuWorkbenchToolBarOptions | undefined
27+
28+
) { }
29+
}
30+
31+
createInstance(MenuWorkbenchToolBar, {
32+
>createInstance(MenuWorkbenchToolBar, { toolbarOptions: { foo(bar) { return bar; } }}) : MenuWorkbenchToolBar
33+
>createInstance : <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>) => R
34+
>MenuWorkbenchToolBar : typeof MenuWorkbenchToolBar
35+
>{ toolbarOptions: { foo(bar) { return bar; } }} : { toolbarOptions: { foo(bar: string): string; }; }
36+
37+
toolbarOptions: {
38+
>toolbarOptions : { foo(bar: string): string; }
39+
>{ foo(bar) { return bar; } } : { foo(bar: string): string; }
40+
41+
foo(bar) { return bar; }
42+
>foo : (bar: string) => string
43+
>bar : string
44+
>bar : string
45+
}
46+
});
47+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// @strict: true
2+
3+
// Repro from #52198
4+
5+
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
6+
7+
export interface IMenuWorkbenchToolBarOptions {
8+
toolbarOptions: {
9+
foo(bar: string): string
10+
};
11+
}
12+
13+
class MenuWorkbenchToolBar {
14+
constructor(
15+
options: IMenuWorkbenchToolBarOptions | undefined,
16+
) { }
17+
}
18+
19+
createInstance(MenuWorkbenchToolBar, {
20+
toolbarOptions: {
21+
foo(bar) { return bar; }
22+
}
23+
});

0 commit comments

Comments
 (0)