@@ -12361,15 +12361,18 @@ namespace ts {
12361
12361
return type;
12362
12362
}
12363
12363
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
+ }
12367
12370
const type = <DeferredTypeReference>createObjectType(ObjectFlags.Reference, target.symbol);
12368
12371
type.target = target;
12369
12372
type.node = node;
12370
12373
type.mapper = mapper;
12371
12374
type.aliasSymbol = aliasSymbol;
12372
- type.aliasTypeArguments = mapper ? instantiateTypes(aliasTypeArguments, mapper) : aliasTypeArguments;
12375
+ type.aliasTypeArguments = aliasTypeArguments;
12373
12376
return type;
12374
12377
}
12375
12378
@@ -15460,17 +15463,19 @@ namespace ts {
15460
15463
// instantiation cache key from the type IDs of the type arguments.
15461
15464
const combinedMapper = combineTypeMappers(type.mapper, mapper);
15462
15465
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)}` : "");
15464
15468
if (!target.instantiations) {
15465
15469
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);
15467
15471
}
15468
15472
let result = target.instantiations.get(id);
15469
15473
if (!result) {
15470
15474
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);
15474
15479
target.instantiations.set(id, result);
15475
15480
}
15476
15481
return result;
@@ -15694,15 +15699,12 @@ namespace ts {
15694
15699
}
15695
15700
if (flags & TypeFlags.Object) {
15696
15701
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;
15700
15707
}
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)) {
15706
15708
return getObjectTypeInstantiation(<TypeReference | AnonymousType | MappedType>type, mapper, aliasSymbol, aliasTypeArguments);
15707
15709
}
15708
15710
return type;
0 commit comments