Skip to content

Commit 1b0d12e

Browse files
committed
Fix issues with re-aliasing
1 parent 54da2a4 commit 1b0d12e

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

Diff for: src/compiler/checker.ts

+19-17
Original file line numberDiff line numberDiff line change
@@ -12361,15 +12361,18 @@ namespace ts {
1236112361
return type;
1236212362
}
1236312363

12364-
function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper): DeferredTypeReference {
12365-
const aliasSymbol = getAliasSymbolForTypeNode(node);
12366-
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
12364+
function createDeferredTypeReference(target: GenericType, node: TypeReferenceNode | ArrayTypeNode | TupleTypeNode, mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): DeferredTypeReference {
12365+
if (!aliasSymbol) {
12366+
aliasSymbol = getAliasSymbolForTypeNode(node);
12367+
const localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
12368+
aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
12369+
}
1236712370
const type = <DeferredTypeReference>createObjectType(ObjectFlags.Reference, target.symbol);
1236812371
type.target = target;
1236912372
type.node = node;
1237012373
type.mapper = mapper;
1237112374
type.aliasSymbol = aliasSymbol;
12372-
type.aliasTypeArguments = mapper ? instantiateTypes(aliasTypeArguments, mapper) : aliasTypeArguments;
12375+
type.aliasTypeArguments = aliasTypeArguments;
1237312376
return type;
1237412377
}
1237512378

@@ -15460,17 +15463,19 @@ namespace ts {
1546015463
// instantiation cache key from the type IDs of the type arguments.
1546115464
const combinedMapper = combineTypeMappers(type.mapper, mapper);
1546215465
const typeArguments = map(typeParameters, t => getMappedType(t, combinedMapper));
15463-
const id = getTypeListId(typeArguments) + (aliasSymbol ? `@${getSymbolId(aliasSymbol)}` : "");
15466+
const newAliasSymbol = aliasSymbol || type.aliasSymbol;
15467+
const id = getTypeListId(typeArguments) + (newAliasSymbol ? `@${getSymbolId(newAliasSymbol)}` : "");
1546415468
if (!target.instantiations) {
1546515469
target.instantiations = new Map<string, Type>();
15466-
target.instantiations.set(getTypeListId(typeParameters), target);
15470+
target.instantiations.set(getTypeListId(typeParameters) + (target.aliasSymbol ? `@${getSymbolId(target.aliasSymbol)}` : ""), target);
1546715471
}
1546815472
let result = target.instantiations.get(id);
1546915473
if (!result) {
1547015474
const newMapper = createTypeMapper(typeParameters, typeArguments);
15471-
result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((<DeferredTypeReference>type).target, (<DeferredTypeReference>type).node, newMapper) :
15472-
target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(<MappedType>target, newMapper, aliasSymbol, aliasTypeArguments) :
15473-
instantiateAnonymousType(target, newMapper, aliasSymbol, aliasTypeArguments);
15475+
const newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper);
15476+
result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((<DeferredTypeReference>type).target, (<DeferredTypeReference>type).node, newMapper, newAliasSymbol, newAliasTypeArguments) :
15477+
target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(<MappedType>target, newMapper, newAliasSymbol, newAliasTypeArguments) :
15478+
instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments);
1547415479
target.instantiations.set(id, result);
1547515480
}
1547615481
return result;
@@ -15694,15 +15699,12 @@ namespace ts {
1569415699
}
1569515700
if (flags & TypeFlags.Object) {
1569615701
const objectFlags = (<ObjectType>type).objectFlags;
15697-
if (objectFlags & ObjectFlags.Reference) {
15698-
if ((<TypeReference>type).node) {
15699-
return getObjectTypeInstantiation(<TypeReference | AnonymousType | MappedType>type, mapper);
15702+
if (objectFlags & (ObjectFlags.Reference | ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
15703+
if (objectFlags & ObjectFlags.Reference && !(<TypeReference>type).node) {
15704+
const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
15705+
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
15706+
return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference((<TypeReference>type).target, newTypeArguments) : type;
1570015707
}
15701-
const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
15702-
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
15703-
return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference((<TypeReference>type).target, newTypeArguments) : type;
15704-
}
15705-
if (objectFlags & (ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
1570615708
return getObjectTypeInstantiation(<TypeReference | AnonymousType | MappedType>type, mapper, aliasSymbol, aliasTypeArguments);
1570715709
}
1570815710
return type;

0 commit comments

Comments
 (0)