@@ -14056,7 +14056,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1405614056 if (getObjectFlags(type) & ObjectFlags.Reference) {
1405714057 const target = (type as TypeReference).target;
1405814058 const typeArguments = getTypeArguments(type as TypeReference);
14059- return length(target.typeParameters) === length(typeArguments) ? createTypeReference(target, concatenate(typeArguments, [thisArgument || target.thisType!]), isInstantiatedType(type) ) : type;
14059+ return length(target.typeParameters) === length(typeArguments) ? createTypeReference(target, concatenate(typeArguments, [thisArgument || target.thisType!])) : type;
1406014060 }
1406114061 else if (type.flags & TypeFlags.Intersection) {
1406214062 const types = sameMap((type as IntersectionType).types, t => getTypeWithThisArgument(t, thisArgument, needApparentType));
@@ -16919,16 +16919,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1691916919 return createTypeReference(target, typeArguments);
1692016920 }
1692116921
16922- function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined, instantiatedReference?: boolean ): TypeReference {
16923- const id = getTypeListId(typeArguments) + (instantiatedReference ? "*" : "") ;
16922+ function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined): TypeReference {
16923+ const id = getTypeListId(typeArguments);
1692416924 let type = target.instantiations.get(id);
1692516925 if (!type) {
1692616926 type = createObjectType(ObjectFlags.Reference, target.symbol) as TypeReference;
1692716927 target.instantiations.set(id, type);
1692816928 type.objectFlags |= typeArguments ? getPropagatingFlagsOfTypes(typeArguments) : 0;
16929- if (instantiatedReference) {
16930- type.objectFlags |= ObjectFlags.InstantiatedReference;
16931- }
1693216929 type.target = target;
1693316930 type.resolvedTypeArguments = typeArguments;
1693416931 }
@@ -16943,13 +16940,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1694316940 return type;
1694416941 }
1694516942
16946- function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[], instantiatedReference?: boolean ): DeferredTypeReference {
16943+ function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): DeferredTypeReference {
1694716944 if (!aliasSymbol) {
1694816945 aliasSymbol = getAliasSymbolForTypeNode(node);
1694916946 const localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
1695016947 aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
1695116948 }
16952- const type = createObjectType(ObjectFlags.Reference | (instantiatedReference ? ObjectFlags.InstantiatedReference : 0) , target.symbol) as DeferredTypeReference;
16949+ const type = createObjectType(ObjectFlags.Reference, target.symbol) as DeferredTypeReference;
1695316950 type.target = target;
1695416951 type.node = node;
1695516952 type.mapper = mapper;
@@ -20783,7 +20780,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2078320780 if (target.objectFlags & ObjectFlags.SingleSignatureType && mapper) {
2078420781 newMapper = combineTypeMappers(newMapper, mapper);
2078520782 }
20786- result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((type as DeferredTypeReference).target, (type as DeferredTypeReference).node, newMapper, newAliasSymbol, newAliasTypeArguments, /*instantiatedReference*/ true ) :
20783+ result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((type as DeferredTypeReference).target, (type as DeferredTypeReference).node, newMapper, newAliasSymbol, newAliasTypeArguments) :
2078720784 target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(target as MappedType, newMapper, newAliasSymbol, newAliasTypeArguments) :
2078820785 instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments);
2078920786 target.instantiations.set(id, result); // Set cached result early in case we recursively invoke instantiation while eagerly computing type variable visibility below
@@ -21064,17 +21061,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2106421061 if (flags & TypeFlags.Object) {
2106521062 const objectFlags = (type as ObjectType).objectFlags;
2106621063 if (objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
21064+ let result;
2106721065 if (objectFlags & ObjectFlags.Reference && !(type as TypeReference).node) {
2106821066 const resolvedTypeArguments = (type as TypeReference).resolvedTypeArguments;
2106921067 const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
21070- return newTypeArguments === resolvedTypeArguments ? type :
21071- (type as TypeReference).target.objectFlags & ObjectFlags.Tuple ? createNormalizedTupleType((type as TypeReference).target as TupleType, newTypeArguments!) :
21072- createTypeReference((type as TypeReference).target, newTypeArguments, /*instantiatedReference*/ true);
21068+ if (newTypeArguments === resolvedTypeArguments) {
21069+ return type;
21070+ }
21071+ result = (type as TypeReference).target.objectFlags & ObjectFlags.Tuple ?
21072+ createNormalizedTupleType((type as TypeReference).target as TupleType, newTypeArguments!) :
21073+ createTypeReference((type as TypeReference).target, newTypeArguments);
2107321074 }
21074- if (objectFlags & ObjectFlags.ReverseMapped) {
21075- return instantiateReverseMappedType(type as ReverseMappedType, mapper);
21075+ else if (objectFlags & ObjectFlags.ReverseMapped) {
21076+ result = instantiateReverseMappedType(type as ReverseMappedType, mapper);
2107621077 }
21077- return getObjectTypeInstantiation(type as TypeReference | AnonymousType | MappedType, mapper, aliasSymbol, aliasTypeArguments);
21078+ else {
21079+ result = getObjectTypeInstantiation(type as TypeReference | AnonymousType | MappedType, mapper, aliasSymbol, aliasTypeArguments);
21080+ }
21081+ (result as ObjectType).objectFlags |= ObjectFlags.InstantiationResult;
21082+ return result;
2107821083 }
2107921084 return type;
2108021085 }
@@ -22324,7 +22329,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2232422329 while (true) {
2232522330 const t = isFreshLiteralType(type) ? (type as FreshableType).regularType :
2232622331 isGenericTupleType(type) ? getNormalizedTupleType(type, writing) :
22327- getObjectFlags(type) & ObjectFlags.Reference ? (type as TypeReference).node ? createTypeReference((type as TypeReference).target, getTypeArguments(type as TypeReference), isInstantiatedType(type) ) : getSingleBaseForNonAugmentingSubtype(type) || type :
22332+ getObjectFlags(type) & ObjectFlags.Reference ? (type as TypeReference).node ? createTypeReference((type as TypeReference).target, getTypeArguments(type as TypeReference)) : getSingleBaseForNonAugmentingSubtype(type) || type :
2232822333 type.flags & TypeFlags.UnionOrIntersection ? getNormalizedUnionOrIntersectionType(type as UnionOrIntersectionType, writing) :
2232922334 type.flags & TypeFlags.Substitution ? writing ? (type as SubstitutionType).baseType : getSubstitutionIntersection(type as SubstitutionType) :
2233022335 type.flags & TypeFlags.Simplifiable ? getSimplifiedType(type, writing) :
@@ -25090,7 +25095,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2509025095 }
2509125096 const result = symbol.flags & SymbolFlags.TypeAlias ?
2509225097 getTypeAliasInstantiation(symbol, instantiateTypes(getSymbolLinks(symbol).typeParameters!, mapper)) :
25093- createTypeReference(type as GenericType, instantiateTypes((type as GenericType).typeParameters, mapper), /*instantiatedReference*/ true );
25098+ createTypeReference(type as GenericType, instantiateTypes((type as GenericType).typeParameters, mapper));
2509425099 markerTypes.add(getTypeId(result));
2509525100 return result;
2509625101 }
@@ -25312,7 +25317,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2531225317 // unique AST node.
2531325318 return (type as TypeReference).node!;
2531425319 }
25315- if (isInstantiatedType( type) && !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class)) {
25320+ if (type.symbol && !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class) && objectFlags & ObjectFlags.InstantiationResult ) {
2531625321 // We track instantiated object types that have a symbol by that symbol (representing the origin of the
2531725322 // type), but exclude the static side of a class since it shares its symbol with the instance side.
2531825323 return type.symbol;
@@ -25341,10 +25346,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2534125346 return type;
2534225347 }
2534325348
25344- function isInstantiatedType(type: Type) {
25345- return !!(type.symbol && getObjectFlags(type)&(ObjectFlags.Instantiated|ObjectFlags.InstantiatedReference));
25346- }
25347-
2534825349 function isPropertyIdenticalTo(sourceProp: Symbol, targetProp: Symbol): boolean {
2534925350 return compareProperties(sourceProp, targetProp, compareTypesIdentical) !== Ternary.False;
2535025351 }
@@ -26052,7 +26053,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2605226053 result = getIntersectionType(sameMap((type as IntersectionType).types, getWidenedType));
2605326054 }
2605426055 else if (isArrayOrTupleType(type)) {
26055- result = createTypeReference(type.target, sameMap(getTypeArguments(type), getWidenedType), isInstantiatedType(type) );
26056+ result = createTypeReference(type.target, sameMap(getTypeArguments(type), getWidenedType));
2605626057 }
2605726058 if (result && context === undefined) {
2605826059 type.widened = result;
@@ -39147,7 +39148,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3914739148 // if the promised type is itself a promise, get the underlying type; otherwise, fallback to the promised type
3914839149 // Unwrap an `Awaited<T>` to `T` to improve inference.
3914939150 promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
39150- return createTypeReference(globalPromiseType, [promisedType], isInstantiatedType(promisedType) );
39151+ return createTypeReference(globalPromiseType, [promisedType]);
3915139152 }
3915239153
3915339154 return unknownType;
@@ -39160,7 +39161,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3916039161 // if the promised type is itself a promise, get the underlying type; otherwise, fallback to the promised type
3916139162 // Unwrap an `Awaited<T>` to `T` to improve inference.
3916239163 promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
39163- return createTypeReference(globalPromiseLikeType, [promisedType], isInstantiatedType(promisedType) );
39164+ return createTypeReference(globalPromiseLikeType, [promisedType]);
3916439165 }
3916539166
3916639167 return unknownType;
0 commit comments