Skip to content

Commit 582742e

Browse files
committed
Track if type originates in resolved type node
1 parent d0f3e73 commit 582742e

2 files changed

Lines changed: 12 additions & 20 deletions

File tree

src/compiler/checker.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16919,13 +16919,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1691916919
return createTypeReference(target, typeArguments);
1692016920
}
1692116921

16922-
function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined): TypeReference {
16922+
function createTypeReference(target: GenericType, typeArguments: readonly Type[] | undefined, fromTypeNode?: boolean): TypeReference {
1692316923
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);
16928-
type.objectFlags |= typeArguments ? getPropagatingFlagsOfTypes(typeArguments) : 0;
16928+
type.objectFlags |= (typeArguments ? getPropagatingFlagsOfTypes(typeArguments) : 0) | (fromTypeNode ? ObjectFlags.FromTypeNode : 0);
1692916929
type.target = target;
1693016930
type.resolvedTypeArguments = typeArguments;
1693116931
}
@@ -17019,7 +17019,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1701917019
// supplied as type arguments and the type reference only specifies arguments for the local type parameters
1702017020
// of the class or interface.
1702117021
const typeArguments = concatenate(type.outerTypeParameters, fillMissingTypeArguments(typeArgumentsFromTypeReferenceNode(node), typeParameters, minTypeArgumentCount, isJs));
17022-
return createTypeReference(type as GenericType, typeArguments);
17022+
return createTypeReference(type as GenericType, typeArguments, /*fromTypeNode*/ true);
1702317023
}
1702417024
return checkNoTypeArguments(node, symbol) ? type : errorType;
1702517025
}
@@ -17834,7 +17834,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1783417834
}
1783517835
else {
1783617836
const elementTypes = node.kind === SyntaxKind.ArrayType ? [getTypeFromTypeNode(node.elementType)] : map(node.elements, getTypeFromTypeNode);
17837-
links.resolvedType = createNormalizedTypeReference(target, elementTypes);
17837+
links.resolvedType = target.objectFlags & ObjectFlags.Tuple ?
17838+
createNormalizedTupleType(target as TupleType, elementTypes) :
17839+
createTypeReference(target, elementTypes, /*fromTypeNode*/ true);
1783817840
}
1783917841
}
1784017842
return links.resolvedType;
@@ -21061,25 +21063,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2106121063
if (flags & TypeFlags.Object) {
2106221064
const objectFlags = (type as ObjectType).objectFlags;
2106321065
if (objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
21064-
let result;
2106521066
if (objectFlags & ObjectFlags.Reference && !(type as TypeReference).node) {
2106621067
const resolvedTypeArguments = (type as TypeReference).resolvedTypeArguments;
2106721068
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
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);
21069+
return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference((type as TypeReference).target, newTypeArguments) : type;
2107421070
}
21075-
else if (objectFlags & ObjectFlags.ReverseMapped) {
21076-
result = instantiateReverseMappedType(type as ReverseMappedType, mapper);
21071+
if (objectFlags & ObjectFlags.ReverseMapped) {
21072+
return instantiateReverseMappedType(type as ReverseMappedType, mapper);
2107721073
}
21078-
else {
21079-
result = getObjectTypeInstantiation(type as TypeReference | AnonymousType | MappedType, mapper, aliasSymbol, aliasTypeArguments);
21080-
}
21081-
(result as ObjectType).objectFlags |= ObjectFlags.InstantiationResult;
21082-
return result;
21074+
return getObjectTypeInstantiation(type as TypeReference | AnonymousType | MappedType, mapper, aliasSymbol, aliasTypeArguments);
2108321075
}
2108421076
return type;
2108521077
}
@@ -25317,7 +25309,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2531725309
// unique AST node.
2531825310
return (type as TypeReference).node!;
2531925311
}
25320-
if (type.symbol && !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class) && objectFlags & ObjectFlags.InstantiationResult) {
25312+
if (type.symbol && !(objectFlags & ObjectFlags.Anonymous && type.symbol.flags & SymbolFlags.Class) && !(objectFlags & ObjectFlags.FromTypeNode)) {
2532125313
// We track instantiated object types that have a symbol by that symbol (representing the origin of the
2532225314
// type), but exclude the static side of a class since it shares its symbol with the instance side.
2532325315
return type.symbol;

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-
InstantiationResult = 1 << 28, // was result of type instantiation
6566+
FromTypeNode = 1 << 28, // Originates in resolved type node
65676567

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

0 commit comments

Comments
 (0)