Skip to content

Commit 61b9da5

Browse files
committed
Cache generic signature instantiations
1 parent ed4fead commit 61b9da5

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4232,7 +4232,7 @@ namespace ts {
42324232
for (const baseSig of baseSignatures) {
42334233
const typeParamCount = baseSig.typeParameters ? baseSig.typeParameters.length : 0;
42344234
if (typeParamCount === typeArgCount) {
4235-
const sig = typeParamCount ? getSignatureInstantiation(baseSig, typeArguments) : cloneSignature(baseSig);
4235+
const sig = typeParamCount ? createSignatureInstantiation(baseSig, typeArguments) : cloneSignature(baseSig);
42364236
sig.typeParameters = classType.localTypeParameters;
42374237
sig.resolvedReturnType = classType;
42384238
result.push(sig);
@@ -4982,6 +4982,12 @@ namespace ts {
49824982
}
49834983

49844984
function getSignatureInstantiation(signature: Signature, typeArguments: Type[]): Signature {
4985+
const instantiations = signature.instantiations || (signature.instantiations = createMap<Signature>());
4986+
const id = getTypeListId(typeArguments);
4987+
return instantiations[id] || (instantiations[id] = createSignatureInstantiation(signature, typeArguments));
4988+
}
4989+
4990+
function createSignatureInstantiation(signature: Signature, typeArguments: Type[]): Signature {
49854991
return instantiateSignature(signature, createTypeMapper(signature.typeParameters, typeArguments), /*eraseTypeParameters*/ true);
49864992
}
49874993

src/compiler/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2923,6 +2923,8 @@ namespace ts {
29232923
isolatedSignatureType?: ObjectType; // A manufactured type that just contains the signature for purposes of signature comparison
29242924
/* @internal */
29252925
typePredicate?: TypePredicate;
2926+
/* @internal */
2927+
instantiations?: Map<Signature>; // Generic signature instantiation cache
29262928
}
29272929

29282930
export const enum IndexKind {

0 commit comments

Comments
 (0)