Only used cached undefined contextual type for requests with no flags (#52224)

This commit is contained in:
Anders Hejlsberg
2023-01-13 10:10:56 -08:00
committed by GitHub
parent d6de73b20a
commit 41e4139357
5 changed files with 165 additions and 1 deletions

View File

@@ -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) {

View File

@@ -0,0 +1,38 @@
//// [cachedContextualTypes.ts]
// Repro from #52198
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): 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; }
}
});

View File

@@ -0,0 +1,55 @@
=== tests/cases/compiler/cachedContextualTypes.ts ===
// Repro from #52198
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): 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))
}
});

View File

@@ -0,0 +1,47 @@
=== tests/cases/compiler/cachedContextualTypes.ts ===
// Repro from #52198
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
>createInstance : <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>) => R
>args : any[]
>ctor : Ctor
>args : ConstructorParameters<Ctor>
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 : <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>) => 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
}
});

View File

@@ -0,0 +1,23 @@
// @strict: true
// Repro from #52198
declare function createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: ConstructorParameters<Ctor>): R;
export interface IMenuWorkbenchToolBarOptions {
toolbarOptions: {
foo(bar: string): string
};
}
class MenuWorkbenchToolBar {
constructor(
options: IMenuWorkbenchToolBarOptions | undefined,
) { }
}
createInstance(MenuWorkbenchToolBar, {
toolbarOptions: {
foo(bar) { return bar; }
}
});