@@ -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!]), !!(getObjectFlags( type) & ObjectFlags.InstantiatedReference )) : type;
14059+ return length(target.typeParameters) === length(typeArguments) ? createTypeReference(target, concatenate(typeArguments, [thisArgument || target.thisType!]), isInstantiatedType( type)) : type;
1406014060 }
1406114061 else if (type.flags & TypeFlags.Intersection) {
1406214062 const types = sameMap((type as IntersectionType).types, t => getTypeWithThisArgument(t, thisArgument, needApparentType));
@@ -16943,13 +16943,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1694316943 return type;
1694416944 }
1694516945
16946- function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): DeferredTypeReference {
16946+ function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[], instantiatedReference?: boolean ): DeferredTypeReference {
1694716947 if (!aliasSymbol) {
1694816948 aliasSymbol = getAliasSymbolForTypeNode(node);
1694916949 const localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
1695016950 aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
1695116951 }
16952- const type = createObjectType(ObjectFlags.Reference, target.symbol) as DeferredTypeReference;
16952+ const type = createObjectType(ObjectFlags.Reference | (instantiatedReference ? ObjectFlags.InstantiatedReference : 0) , target.symbol) as DeferredTypeReference;
1695316953 type.target = target;
1695416954 type.node = node;
1695516955 type.mapper = mapper;
@@ -20783,7 +20783,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2078320783 if (target.objectFlags & ObjectFlags.SingleSignatureType && mapper) {
2078420784 newMapper = combineTypeMappers(newMapper, mapper);
2078520785 }
20786- result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((type as DeferredTypeReference).target, (type as DeferredTypeReference).node, newMapper, newAliasSymbol, newAliasTypeArguments) :
20786+ result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((type as DeferredTypeReference).target, (type as DeferredTypeReference).node, newMapper, newAliasSymbol, newAliasTypeArguments, /*instantiatedReference*/ true ) :
2078720787 target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(target as MappedType, newMapper, newAliasSymbol, newAliasTypeArguments) :
2078820788 instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments);
2078920789 target.instantiations.set(id, result); // Set cached result early in case we recursively invoke instantiation while eagerly computing type variable visibility below
@@ -22324,7 +22324,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2232422324 while (true) {
2232522325 const t = isFreshLiteralType(type) ? (type as FreshableType).regularType :
2232622326 isGenericTupleType(type) ? getNormalizedTupleType(type, writing) :
22327- getObjectFlags(type) & ObjectFlags.Reference ? (type as TypeReference).node ? createTypeReference((type as TypeReference).target, getTypeArguments(type as TypeReference)) : getSingleBaseForNonAugmentingSubtype(type) || type :
22327+ getObjectFlags(type) & ObjectFlags.Reference ? (type as TypeReference).node ? createTypeReference((type as TypeReference).target, getTypeArguments(type as TypeReference), isInstantiatedType(type) ) : getSingleBaseForNonAugmentingSubtype(type) || type :
2232822328 type.flags & TypeFlags.UnionOrIntersection ? getNormalizedUnionOrIntersectionType(type as UnionOrIntersectionType, writing) :
2232922329 type.flags & TypeFlags.Substitution ? writing ? (type as SubstitutionType).baseType : getSubstitutionIntersection(type as SubstitutionType) :
2233022330 type.flags & TypeFlags.Simplifiable ? getSimplifiedType(type, writing) :
@@ -25312,10 +25312,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2531225312 // unique AST node.
2531325313 return (type as TypeReference).node!;
2531425314 }
25315- if (
25316- type.symbol && objectFlags & (ObjectFlags.Instantiated | ObjectFlags.InstantiatedReference) &&
25317- !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class)
25318- ) {
25315+ if (isInstantiatedType(type) && !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class)) {
2531925316 // We track instantiated object types that have a symbol by that symbol (representing the origin of the
2532025317 // type), but exclude the static side of a class since it shares its symbol with the instance side.
2532125318 return type.symbol;
@@ -25344,6 +25341,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2534425341 return type;
2534525342 }
2534625343
25344+ function isInstantiatedType(type: Type) {
25345+ return !!(type.symbol && getObjectFlags(type)&(ObjectFlags.Instantiated|ObjectFlags.InstantiatedReference));
25346+ }
25347+
2534725348 function isPropertyIdenticalTo(sourceProp: Symbol, targetProp: Symbol): boolean {
2534825349 return compareProperties(sourceProp, targetProp, compareTypesIdentical) !== Ternary.False;
2534925350 }
@@ -26051,7 +26052,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2605126052 result = getIntersectionType(sameMap((type as IntersectionType).types, getWidenedType));
2605226053 }
2605326054 else if (isArrayOrTupleType(type)) {
26054- result = createTypeReference(type.target, sameMap(getTypeArguments(type), getWidenedType));
26055+ result = createTypeReference(type.target, sameMap(getTypeArguments(type), getWidenedType), isInstantiatedType(type) );
2605526056 }
2605626057 if (result && context === undefined) {
2605726058 type.widened = result;
@@ -39146,7 +39147,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3914639147 // if the promised type is itself a promise, get the underlying type; otherwise, fallback to the promised type
3914739148 // Unwrap an `Awaited<T>` to `T` to improve inference.
3914839149 promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
39149- return createTypeReference(globalPromiseType, [promisedType]);
39150+ return createTypeReference(globalPromiseType, [promisedType], isInstantiatedType(promisedType) );
3915039151 }
3915139152
3915239153 return unknownType;
@@ -39159,7 +39160,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3915939160 // if the promised type is itself a promise, get the underlying type; otherwise, fallback to the promised type
3916039161 // Unwrap an `Awaited<T>` to `T` to improve inference.
3916139162 promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
39162- return createTypeReference(globalPromiseLikeType, [promisedType]);
39163+ return createTypeReference(globalPromiseLikeType, [promisedType], isInstantiatedType(promisedType) );
3916339164 }
3916439165
3916539166 return unknownType;
0 commit comments