diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a39f1a9a688..3f4d60657e4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28842,7 +28842,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } const index = findContextualNode(node); if (index >= 0) { - return contextualTypes[index]; + const cached = contextualTypes[index]; + if (cached || !contextFlags) return cached; } const { parent } = node; switch (parent.kind) { diff --git a/tests/baselines/reference/cachedContextualTypes.js b/tests/baselines/reference/cachedContextualTypes.js new file mode 100644 index 00000000000..c3f9d06d57d --- /dev/null +++ b/tests/baselines/reference/cachedContextualTypes.js @@ -0,0 +1,38 @@ +//// [cachedContextualTypes.ts] +// Repro from #52198 + +declare function createInstance any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters): R; + +export interface IMenuWorkbenchToolBarOptions { + toolbarOptions: { + foo(bar: string): string + }; +} + +class MenuWorkbenchToolBar { + constructor( + options: IMenuWorkbenchToolBarOptions | undefined, + ) { } +} + +createInstance(MenuWorkbenchToolBar, { + toolbarOptions: { + foo(bar) { return bar; } + } +}); + + +//// [cachedContextualTypes.js] +"use strict"; +// Repro from #52198 +Object.defineProperty(exports, "__esModule", { value: true }); +var MenuWorkbenchToolBar = /** @class */ (function () { + function MenuWorkbenchToolBar(options) { + } + return MenuWorkbenchToolBar; +}()); +createInstance(MenuWorkbenchToolBar, { + toolbarOptions: { + foo: function (bar) { return bar; } + } +}); diff --git a/tests/baselines/reference/cachedContextualTypes.symbols b/tests/baselines/reference/cachedContextualTypes.symbols new file mode 100644 index 00000000000..c4e8ad97394 --- /dev/null +++ b/tests/baselines/reference/cachedContextualTypes.symbols @@ -0,0 +1,55 @@ +=== tests/cases/compiler/cachedContextualTypes.ts === +// Repro from #52198 + +declare function createInstance any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters): R; +>createInstance : Symbol(createInstance, Decl(cachedContextualTypes.ts, 0, 0)) +>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32)) +>args : Symbol(args, Decl(cachedContextualTypes.ts, 2, 50)) +>R : Symbol(R, Decl(cachedContextualTypes.ts, 2, 73)) +>InstanceType : Symbol(InstanceType, Decl(lib.es5.d.ts, --, --)) +>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32)) +>ctor : Symbol(ctor, Decl(cachedContextualTypes.ts, 2, 104)) +>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32)) +>args : Symbol(args, Decl(cachedContextualTypes.ts, 2, 115)) +>ConstructorParameters : Symbol(ConstructorParameters, Decl(lib.es5.d.ts, --, --)) +>Ctor : Symbol(Ctor, Decl(cachedContextualTypes.ts, 2, 32)) +>R : Symbol(R, Decl(cachedContextualTypes.ts, 2, 73)) + +export interface IMenuWorkbenchToolBarOptions { +>IMenuWorkbenchToolBarOptions : Symbol(IMenuWorkbenchToolBarOptions, Decl(cachedContextualTypes.ts, 2, 157)) + + toolbarOptions: { +>toolbarOptions : Symbol(IMenuWorkbenchToolBarOptions.toolbarOptions, Decl(cachedContextualTypes.ts, 4, 47)) + + foo(bar: string): string +>foo : Symbol(foo, Decl(cachedContextualTypes.ts, 5, 21)) +>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 6, 12)) + + }; +} + +class MenuWorkbenchToolBar { +>MenuWorkbenchToolBar : Symbol(MenuWorkbenchToolBar, Decl(cachedContextualTypes.ts, 8, 1)) + + constructor( + options: IMenuWorkbenchToolBarOptions | undefined, +>options : Symbol(options, Decl(cachedContextualTypes.ts, 11, 16)) +>IMenuWorkbenchToolBarOptions : Symbol(IMenuWorkbenchToolBarOptions, Decl(cachedContextualTypes.ts, 2, 157)) + + ) { } +} + +createInstance(MenuWorkbenchToolBar, { +>createInstance : Symbol(createInstance, Decl(cachedContextualTypes.ts, 0, 0)) +>MenuWorkbenchToolBar : Symbol(MenuWorkbenchToolBar, Decl(cachedContextualTypes.ts, 8, 1)) + + toolbarOptions: { +>toolbarOptions : Symbol(toolbarOptions, Decl(cachedContextualTypes.ts, 16, 38)) + + foo(bar) { return bar; } +>foo : Symbol(foo, Decl(cachedContextualTypes.ts, 17, 21)) +>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 18, 12)) +>bar : Symbol(bar, Decl(cachedContextualTypes.ts, 18, 12)) + } +}); + diff --git a/tests/baselines/reference/cachedContextualTypes.types b/tests/baselines/reference/cachedContextualTypes.types new file mode 100644 index 00000000000..c91f9c7720c --- /dev/null +++ b/tests/baselines/reference/cachedContextualTypes.types @@ -0,0 +1,47 @@ +=== tests/cases/compiler/cachedContextualTypes.ts === +// Repro from #52198 + +declare function createInstance any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters): R; +>createInstance : any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters) => R +>args : any[] +>ctor : Ctor +>args : ConstructorParameters + +export interface IMenuWorkbenchToolBarOptions { + toolbarOptions: { +>toolbarOptions : { foo(bar: string): string; } + + foo(bar: string): string +>foo : (bar: string) => string +>bar : string + + }; +} + +class MenuWorkbenchToolBar { +>MenuWorkbenchToolBar : MenuWorkbenchToolBar + + constructor( + options: IMenuWorkbenchToolBarOptions | undefined, +>options : IMenuWorkbenchToolBarOptions | undefined + + ) { } +} + +createInstance(MenuWorkbenchToolBar, { +>createInstance(MenuWorkbenchToolBar, { toolbarOptions: { foo(bar) { return bar; } }}) : MenuWorkbenchToolBar +>createInstance : any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters) => R +>MenuWorkbenchToolBar : typeof MenuWorkbenchToolBar +>{ toolbarOptions: { foo(bar) { return bar; } }} : { toolbarOptions: { foo(bar: string): string; }; } + + toolbarOptions: { +>toolbarOptions : { foo(bar: string): string; } +>{ foo(bar) { return bar; } } : { foo(bar: string): string; } + + foo(bar) { return bar; } +>foo : (bar: string) => string +>bar : string +>bar : string + } +}); + diff --git a/tests/cases/compiler/cachedContextualTypes.ts b/tests/cases/compiler/cachedContextualTypes.ts new file mode 100644 index 00000000000..bad3c08ccd4 --- /dev/null +++ b/tests/cases/compiler/cachedContextualTypes.ts @@ -0,0 +1,23 @@ +// @strict: true + +// Repro from #52198 + +declare function createInstance any, R extends InstanceType>(ctor: Ctor, ...args: ConstructorParameters): R; + +export interface IMenuWorkbenchToolBarOptions { + toolbarOptions: { + foo(bar: string): string + }; +} + +class MenuWorkbenchToolBar { + constructor( + options: IMenuWorkbenchToolBarOptions | undefined, + ) { } +} + +createInstance(MenuWorkbenchToolBar, { + toolbarOptions: { + foo(bar) { return bar; } + } +});