Skip to content

Commit 5ecb777

Browse files
committed
Propagate instantiation flag
1 parent ad973af commit 5ecb777

1 file changed

Lines changed: 13 additions & 12 deletions

File tree

src/compiler/checker.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)