Skip to content

Commit b0f5c70

Browse files
committed
only disable cache on certain makeFunctionTypeMappers
1 parent e2e7091 commit b0f5c70

7 files changed

+58
-96
lines changed

src/compiler/checker.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -2101,6 +2101,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21012101
var numericStringType = getTemplateLiteralType(["", ""], [numberType]); // The `${number}` type
21022102

21032103
var restrictiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? getRestrictiveTypeParameter(t as TypeParameter) : t, () => "(restrictive mapper)");
2104+
restrictiveMapper.instantiations = voidMap;
21042105
var permissiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? wildcardType : t, () => "(permissive mapper)");
21052106
var uniqueLiteralType = createIntrinsicType(TypeFlags.Never, "never", /*objectFlags*/ undefined, "unique literal"); // `uniqueLiteralType` is a special `never` flagged by union reduction to behave as a literal
21062107
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)
@@ -2111,12 +2112,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21112112
}
21122113
return t;
21132114
}, () => "(unmeasurable reporter)");
2115+
reportUnreliableMapper.instantiations = voidMap;
21142116
var reportUnmeasurableMapper = makeFunctionTypeMapper(t => {
21152117
if (outofbandVarianceMarkerHandler && (t === markerSuperType || t === markerSubType || t === markerOtherType)) {
21162118
outofbandVarianceMarkerHandler(/*onlyUnreliable*/ false);
21172119
}
21182120
return t;
21192121
}, () => "(unreliable reporter)");
2122+
reportUnmeasurableMapper.instantiations = voidMap;
21202123

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

1996319966
function makeFunctionTypeMapper(func: (t: Type) => Type, debugInfo: () => string): TypeMapper {
19964-
const mapper = Debug.attachDebugPrototypeIfDebug({ kind: TypeMapKind.Function, func, debugInfo: Debug.isDebugging ? debugInfo : undefined });
19965-
mapper.instantiations = voidMap;
19966-
return mapper;
19967+
return Debug.attachDebugPrototypeIfDebug({ kind: TypeMapKind.Function, func, debugInfo: Debug.isDebugging ? debugInfo : undefined });
1996719968
}
1996819969

1996919970
function makeDeferredTypeMapper(sources: readonly TypeParameter[], targets: (() => Type)[]) {

tests/baselines/reference/largeTupleTypes.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
=== Performance Stats ===
44
Assignability cache: 1,000
55
Type Count: 25,000
6-
Instantiation count: 50,000
6+
Instantiation count: 25,000
77
Symbol count: 50,000
88

99
=== largeTupleTypes.ts ===

tests/baselines/reference/longObjectInstantiationChain1.errors.txt

+1-19
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
longObjectInstantiationChain1.ts(57,4): error TS2339: Property 'p51' does not exist on type 'merge<{ p1: number; }, { p2: number; }>'.
22
longObjectInstantiationChain1.ts(62,4): error TS2339: Property 'p4' does not exist on type 'merge<merge<{ p1: number; }, { p2: number; }>, { p3: number; }>'.
3-
longObjectInstantiationChain1.ts(64,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
4-
longObjectInstantiationChain1.ts(65,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
5-
longObjectInstantiationChain1.ts(68,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
63
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; }>'.
74
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; }>'.
8-
longObjectInstantiationChain1.ts(73,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
9-
longObjectInstantiationChain1.ts(74,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
10-
longObjectInstantiationChain1.ts(75,1): error TS2589: Type instantiation is excessively deep and possibly infinite.
115

126

13-
==== longObjectInstantiationChain1.ts (10 errors) ====
7+
==== longObjectInstantiationChain1.ts (4 errors) ====
148
export type merge<base, props> = Omit<base, keyof props & keyof base> & props;
159

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

8175
o25.p1;
82-
~~~~~~
83-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
8476
o25.p10;
85-
~~~~~~~
86-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
8777
o25.p26;
8878

8979
o30.p1;
90-
~~~~~~
91-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
9280
o30.p31;
9381
o30.p38; // error
9482
~~~
@@ -98,13 +86,7 @@ longObjectInstantiationChain1.ts(75,1): error TS2589: Type instantiation is exce
9886
!!! 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; }>'.
9987

10088
o50.p1;
101-
~~~~~~
102-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
10389
o50.p31;
104-
~~~~~~~
105-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
10690
o50.p38;
107-
~~~~~~~
108-
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
10991
o50.p51;
11092

0 commit comments

Comments
 (0)