Skip to content

Commit 21e3d45

Browse files
committed
Use symbol for type identity when type was result of instantiation
1 parent 5ecb777 commit 21e3d45

2 files changed

Lines changed: 27 additions & 26 deletions

File tree

src/compiler/checker.ts

Lines changed: 26 additions & 25 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!]), 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;

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6563,7 +6563,7 @@ export const enum ObjectFlags {
65636563
IdenticalBaseTypeCalculated = 1 << 25, // has had `getSingleBaseForNonAugmentingSubtype` invoked on it already
65646564
/** @internal */
65656565
IdenticalBaseTypeExists = 1 << 26, // has a defined cachedEquivalentBaseType member
6566-
InstantiatedReference = 1 << 28, // Originates in instantiation of type reference
6566+
InstantiationResult = 1 << 28, // was result of type instantiation
65676567

65686568
// Flags that require TypeFlags.UnionOrIntersection or TypeFlags.Substitution
65696569
/** @internal */

0 commit comments

Comments
 (0)