Skip to content
Merged
Prev Previous commit
Next Next commit
only disable cache on certain makeFunctionTypeMappers
  • Loading branch information
Andarist committed Apr 1, 2025
commit b0f5c703072ab9ea97d73176f379014e2e28048d
7 changes: 4 additions & 3 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2101,6 +2101,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
var numericStringType = getTemplateLiteralType(["", ""], [numberType]); // The `${number}` type

var restrictiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? getRestrictiveTypeParameter(t as TypeParameter) : t, () => "(restrictive mapper)");
restrictiveMapper.instantiations = voidMap;
var permissiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? wildcardType : t, () => "(permissive mapper)");
var uniqueLiteralType = createIntrinsicType(TypeFlags.Never, "never", /*objectFlags*/ undefined, "unique literal"); // `uniqueLiteralType` is a special `never` flagged by union reduction to behave as a literal
var uniqueLiteralMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? uniqueLiteralType : t, () => "(unique literal mapper)"); // replace all type parameters with the unique literal type (disregarding constraints)
Expand All @@ -2111,12 +2112,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
return t;
}, () => "(unmeasurable reporter)");
reportUnreliableMapper.instantiations = voidMap;
var reportUnmeasurableMapper = makeFunctionTypeMapper(t => {
if (outofbandVarianceMarkerHandler && (t === markerSuperType || t === markerSubType || t === markerOtherType)) {
outofbandVarianceMarkerHandler(/*onlyUnreliable*/ false);
}
return t;
}, () => "(unreliable reporter)");
reportUnmeasurableMapper.instantiations = voidMap;

var emptyObjectType = createAnonymousType(/*symbol*/ undefined, emptySymbols, emptyArray, emptyArray, emptyArray);
var emptyJsxObjectType = createAnonymousType(/*symbol*/ undefined, emptySymbols, emptyArray, emptyArray, emptyArray);
Expand Down Expand Up @@ -19961,9 +19964,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}

function makeFunctionTypeMapper(func: (t: Type) => Type, debugInfo: () => string): TypeMapper {
const mapper = Debug.attachDebugPrototypeIfDebug({ kind: TypeMapKind.Function, func, debugInfo: Debug.isDebugging ? debugInfo : undefined });
mapper.instantiations = voidMap;
return mapper;
return Debug.attachDebugPrototypeIfDebug({ kind: TypeMapKind.Function, func, debugInfo: Debug.isDebugging ? debugInfo : undefined });
}

function makeDeferredTypeMapper(sources: readonly TypeParameter[], targets: (() => Type)[]) {
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/largeTupleTypes.types
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
=== Performance Stats ===
Assignability cache: 1,000
Type Count: 25,000
Instantiation count: 50,000
Instantiation count: 25,000
Symbol count: 50,000

=== largeTupleTypes.ts ===
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
longObjectInstantiationChain1.ts(57,4): error TS2339: Property 'p51' does not exist on type 'merge<{ p1: number; }, { p2: number; }>'.
longObjectInstantiationChain1.ts(62,4): error TS2339: Property 'p4' does not exist on type 'merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>'.
longObjectInstantiationChain1.ts(64,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
longObjectInstantiationChain1.ts(65,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
longObjectInstantiationChain1.ts(68,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
longObjectInstantiationChain1.ts(70,5): error TS2339: Property 'p38' does not exist on type 'merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>, { p4: number; }>, { p5: number; }>, { p6: number; }>, { p7: number; }>, { p8: number; }>, { p9: number; }>, { p10: number; }>, { p11: number; }>, { p12: number; }>, { p13: number; }>, { p14: number; }>, { p15: number; }>, { p16: number; }>, { p17: number; }>, { p18: number; }>, { p19: number; }>, { p20: number; }>, { p21: number; }>, { p22: number; }>, { p23: number; }>, { p24: number; }>, { p25: number; }>, { p26: number; }>, { p27: number; }>, { p28: number; }>, { p29: number; }>, { p30: number; }>, { p31: number; }>'.
longObjectInstantiationChain1.ts(71,5): error TS2339: Property 'p51' does not exist on type 'merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>, { p4: number; }>, { p5: number; }>, { p6: number; }>, { p7: number; }>, { p8: number; }>, { p9: number; }>, { p10: number; }>, { p11: number; }>, { p12: number; }>, { p13: number; }>, { p14: number; }>, { p15: number; }>, { p16: number; }>, { p17: number; }>, { p18: number; }>, { p19: number; }>, { p20: number; }>, { p21: number; }>, { p22: number; }>, { p23: number; }>, { p24: number; }>, { p25: number; }>, { p26: number; }>, { p27: number; }>, { p28: number; }>, { p29: number; }>, { p30: number; }>, { p31: number; }>'.
longObjectInstantiationChain1.ts(73,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
longObjectInstantiationChain1.ts(74,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
longObjectInstantiationChain1.ts(75,1): error TS2589: Type instantiation is excessively deep and possibly infinite.


==== longObjectInstantiationChain1.ts (10 errors) ====
==== longObjectInstantiationChain1.ts (4 errors) ====
export type merge<base, props> = Omit<base, keyof props & keyof base> & props;

declare const merge: <l, r>(l: l, r: r) => merge<l, r>;
Expand Down Expand Up @@ -79,16 +73,10 @@ longObjectInstantiationChain1.ts(75,1): error TS2589: Type instantiation is exce
!!! error TS2339: Property 'p4' does not exist on type 'merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>'.

o25.p1;
~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o25.p10;
~~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o25.p26;

o30.p1;
~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o30.p31;
o30.p38; // error
~~~
Expand All @@ -98,13 +86,7 @@ longObjectInstantiationChain1.ts(75,1): error TS2589: Type instantiation is exce
!!! error TS2339: Property 'p51' does not exist on type 'merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>, { p4: number; }>, { p5: number; }>, { p6: number; }>, { p7: number; }>, { p8: number; }>, { p9: number; }>, { p10: number; }>, { p11: number; }>, { p12: number; }>, { p13: number; }>, { p14: number; }>, { p15: number; }>, { p16: number; }>, { p17: number; }>, { p18: number; }>, { p19: number; }>, { p20: number; }>, { p21: number; }>, { p22: number; }>, { p23: number; }>, { p24: number; }>, { p25: number; }>, { p26: number; }>, { p27: number; }>, { p28: number; }>, { p29: number; }>, { p30: number; }>, { p31: number; }>'.

o50.p1;
~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o50.p31;
~~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o50.p38;
~~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
o50.p51;

Loading
Loading