Skip to content

Commit 1cc7a53

Browse files
committed
Shared early couldContainTypeVariables check in instantiateType
1 parent e897eb1 commit 1cc7a53

File tree

1 file changed

+12
-26
lines changed

1 file changed

+12
-26
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14102,7 +14102,7 @@ namespace ts {
1410214102
function instantiateType(type: Type, mapper: TypeMapper | undefined): Type;
1410314103
function instantiateType(type: Type | undefined, mapper: TypeMapper | undefined): Type | undefined;
1410414104
function instantiateType(type: Type | undefined, mapper: TypeMapper | undefined): Type | undefined {
14105-
if (!type || !mapper) {
14105+
if (!(type && mapper && couldContainTypeVariables(type))) {
1410614106
return type;
1410714107
}
1410814108
if (instantiationDepth === 50 || instantiationCount >= 5000000) {
@@ -14138,37 +14138,23 @@ namespace ts {
1413814138
}
1413914139
if (flags & TypeFlags.Object) {
1414014140
const objectFlags = (<ObjectType>type).objectFlags;
14141-
if (objectFlags & ObjectFlags.Anonymous) {
14142-
// If the anonymous type originates in a declaration of a function, method, class, or
14143-
// interface, in an object type literal, or in an object literal expression, we may need
14144-
// to instantiate the type because it might reference a type parameter.
14145-
return couldContainTypeVariables(type) ?
14146-
getObjectTypeInstantiation(<AnonymousType>type, mapper) : type;
14147-
}
14148-
if (objectFlags & ObjectFlags.Mapped) {
14149-
return getObjectTypeInstantiation(<AnonymousType>type, mapper);
14150-
}
14151-
if (objectFlags & ObjectFlags.Reference) {
14152-
if ((<TypeReference>type).node) {
14153-
return getObjectTypeInstantiation(<TypeReference>type, mapper);
14141+
if (objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
14142+
if (objectFlags & ObjectFlags.Reference && !((<TypeReference>type).node)) {
14143+
const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
14144+
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
14145+
return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
1415414146
}
14155-
const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
14156-
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
14157-
return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
14147+
return getObjectTypeInstantiation(<TypeReference | AnonymousType | MappedType>type, mapper);
1415814148
}
1415914149
return type;
1416014150
}
14161-
if ((flags & TypeFlags.Intersection) || (flags & TypeFlags.Union && !(flags & TypeFlags.Primitive))) {
14162-
if (!couldContainTypeVariables(type)) {
14163-
return type;
14164-
}
14151+
if (flags & TypeFlags.UnionOrIntersection) {
1416514152
const types = (<UnionOrIntersectionType>type).types;
1416614153
const newTypes = instantiateTypes(types, mapper);
14167-
return newTypes === types
14168-
? type
14169-
: (flags & TypeFlags.Intersection)
14170-
? getIntersectionType(newTypes, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper))
14171-
: getUnionType(newTypes, UnionReduction.Literal, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
14154+
return newTypes === types ? type :
14155+
flags & TypeFlags.Intersection ?
14156+
getIntersectionType(newTypes, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper)) :
14157+
getUnionType(newTypes, UnionReduction.Literal, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
1417214158
}
1417314159
if (flags & TypeFlags.Index) {
1417414160
return getIndexType(instantiateType((<IndexType>type).type, mapper));

0 commit comments

Comments
 (0)