@@ -9077,10 +9077,10 @@ namespace ts {
9077
9077
return type;
9078
9078
}
9079
9079
9080
- function createDeferredTypeReference(target: GenericType, typeArgumentNodes: ReadonlyArray<TypeNode> , mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: ReadonlyArray<Type>): TypeReference {
9081
- const type = <TypeReference >createObjectType(ObjectFlags.Reference, target.symbol);
9080
+ function createDeferredTypeReference(target: GenericType, node: ArrayTypeNode | TupleTypeNode , mapper?: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: ReadonlyArray<Type>): DeferredTypeReference {
9081
+ const type = <DeferredTypeReference >createObjectType(ObjectFlags.Reference, target.symbol);
9082
9082
type.target = target;
9083
- type.typeArgumentNodes = typeArgumentNodes ;
9083
+ type.node = node ;
9084
9084
type.mapper = mapper;
9085
9085
type.aliasSymbol = aliasSymbol;
9086
9086
type.aliasTypeArguments = aliasTypeArguments;
@@ -9089,7 +9089,7 @@ namespace ts {
9089
9089
9090
9090
function getTypeArguments(type: TypeReference): ReadonlyArray<Type> {
9091
9091
if (!type.resolvedTypeArguments) {
9092
- const typeArguments = type.typeArgumentNodes ? map(type.typeArgumentNodes , getTypeFromTypeNode) : emptyArray;
9092
+ const typeArguments = type.node ? map(type.node.kind === SyntaxKind.ArrayType ? [type.node.elementType] : type.node.elementTypes , getTypeFromTypeNode) : emptyArray;
9093
9093
type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
9094
9094
}
9095
9095
return type.resolvedTypeArguments;
@@ -9598,8 +9598,8 @@ namespace ts {
9598
9598
const target = getArrayOrTupleTargetType(node);
9599
9599
const aliasSymbol = getAliasSymbolForTypeNode(node);
9600
9600
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
9601
- const elementTypes = node.kind === SyntaxKind.ArrayType ? [ node.elementType] : node.elementTypes;
9602
- links.resolvedType = elementTypes.length ? createDeferredTypeReference(target, elementTypes , /*mapper*/ undefined, aliasSymbol, aliasTypeArguments) : target ;
9601
+ links.resolvedType = node.kind === SyntaxKind.TupleType && node.elementTypes.length === 0 ? target :
9602
+ createDeferredTypeReference(target, node , /*mapper*/ undefined, aliasSymbol, aliasTypeArguments);
9603
9603
}
9604
9604
return links.resolvedType;
9605
9605
}
@@ -11393,17 +11393,17 @@ namespace ts {
11393
11393
return result;
11394
11394
}
11395
11395
11396
- function getAnonymousTypeInstantiation (type: AnonymousType, mapper: TypeMapper) {
11396
+ function getObjectTypeInstantiation (type: AnonymousType | DeferredTypeReference , mapper: TypeMapper) {
11397
11397
const target = type.objectFlags & ObjectFlags.Instantiated ? type.target! : type;
11398
- const { symbol } = target ;
11399
- const links = getSymbolLinks(symbol );
11398
+ const node = type.objectFlags & ObjectFlags.Reference ? (<TypeReference>type).node! : type.symbol.declarations[0] ;
11399
+ const links = getNodeLinks(node );
11400
11400
let typeParameters = links.outerTypeParameters;
11401
11401
if (!typeParameters) {
11402
11402
// The first time an anonymous type is instantiated we compute and store a list of the type
11403
11403
// parameters that are in scope (and therefore potentially referenced). For type literals that
11404
11404
// aren't the right hand side of a generic type alias declaration we optimize by reducing the
11405
11405
// set of type parameters to those that are possibly referenced in the literal.
11406
- let declaration = symbol.declarations[0] ;
11406
+ let declaration = node ;
11407
11407
if (isInJSFile(declaration)) {
11408
11408
const paramTag = findAncestor(declaration, isJSDocParameterTag);
11409
11409
if (paramTag) {
@@ -11419,7 +11419,7 @@ namespace ts {
11419
11419
outerTypeParameters = addRange(outerTypeParameters, templateTagParameters);
11420
11420
}
11421
11421
typeParameters = outerTypeParameters || emptyArray;
11422
- typeParameters = symbol.flags & SymbolFlags.TypeLiteral && !target.aliasTypeArguments ?
11422
+ typeParameters = (target.objectFlags & ObjectFlags.Reference || target. symbol.flags & SymbolFlags.TypeLiteral) && !target.aliasTypeArguments ?
11423
11423
filter(typeParameters, tp => isTypeParameterPossiblyReferenced(tp, declaration)) :
11424
11424
typeParameters;
11425
11425
links.outerTypeParameters = typeParameters;
@@ -11432,13 +11432,14 @@ namespace ts {
11432
11432
// We are instantiating an anonymous type that has one or more type parameters in scope. Apply the
11433
11433
// mapper to the type parameters to produce the effective list of type arguments, and compute the
11434
11434
// instantiation cache key from the type IDs of the type arguments.
11435
- const combinedMapper = type.objectFlags & ObjectFlags.Instantiated ? combineTypeMappers(type.mapper!, mapper) : mapper;
11436
- const typeArguments: Type[] = map(typeParameters, combinedMapper);
11435
+ const typeArguments: Type[] = map(typeParameters, combineTypeMappers(type.mapper, mapper));
11437
11436
const id = getTypeListId(typeArguments);
11438
11437
let result = links.instantiations!.get(id);
11439
11438
if (!result) {
11440
11439
const newMapper = createTypeMapper(typeParameters, typeArguments);
11441
- result = target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(<MappedType>target, newMapper) : instantiateAnonymousType(target, newMapper);
11440
+ result = target.objectFlags & ObjectFlags.Reference ? instantiateDeferredTypeReference(<DeferredTypeReference>type, newMapper) :
11441
+ target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(<MappedType>target, newMapper) :
11442
+ instantiateAnonymousType(target, newMapper);
11442
11443
links.instantiations!.set(id, result);
11443
11444
}
11444
11445
return result;
@@ -11570,6 +11571,10 @@ namespace ts {
11570
11571
return result;
11571
11572
}
11572
11573
11574
+ function instantiateDeferredTypeReference(type: DeferredTypeReference, mapper: TypeMapper): TypeReference {
11575
+ return createDeferredTypeReference(type.target, type.node, mapper, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
11576
+ }
11577
+
11573
11578
function getConditionalTypeInstantiation(type: ConditionalType, mapper: TypeMapper): Type {
11574
11579
const root = type.root;
11575
11580
if (root.outerTypeParameters) {
@@ -11635,17 +11640,14 @@ namespace ts {
11635
11640
// interface, in an object type literal, or in an object literal expression, we may need
11636
11641
// to instantiate the type because it might reference a type parameter.
11637
11642
return couldContainTypeVariables(type) ?
11638
- getAnonymousTypeInstantiation (<AnonymousType>type, mapper) : type;
11643
+ getObjectTypeInstantiation (<AnonymousType>type, mapper) : type;
11639
11644
}
11640
11645
if (objectFlags & ObjectFlags.Mapped) {
11641
- return getAnonymousTypeInstantiation (<AnonymousType>type, mapper);
11646
+ return getObjectTypeInstantiation (<AnonymousType>type, mapper);
11642
11647
}
11643
11648
if (objectFlags & ObjectFlags.Reference) {
11644
- const typeArgumentNodes = (<TypeReference>type).typeArgumentNodes;
11645
- if (typeArgumentNodes) {
11646
- const combinedMapper = combineTypeMappers((<TypeReference>type).mapper, mapper);
11647
- return createDeferredTypeReference((<TypeReference>type).target, typeArgumentNodes, combinedMapper,
11648
- (<TypeReference>type).aliasSymbol, instantiateTypes((<TypeReference>type).aliasTypeArguments, combinedMapper));
11649
+ if ((<TypeReference>type).node) {
11650
+ return getObjectTypeInstantiation(<TypeReference>type, mapper);
11649
11651
}
11650
11652
const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
11651
11653
const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
@@ -14440,7 +14442,7 @@ namespace ts {
14440
14442
}
14441
14443
14442
14444
function isNonDeferredTypeReference(type: Type): type is TypeReference {
14443
- return !!(getObjectFlags(type) & ObjectFlags.Reference) && !(<TypeReference>type).typeArgumentNodes ;
14445
+ return !!(getObjectFlags(type) & ObjectFlags.Reference) && !(<TypeReference>type).node ;
14444
14446
}
14445
14447
14446
14448
function isTypeReferenceWithGenericArguments(type: Type): boolean {
@@ -22849,7 +22851,7 @@ namespace ts {
22849
22851
* Indicates whether a declaration can be treated as a constructor in a JavaScript
22850
22852
* file.
22851
22853
*/
22852
- function isJSConstructor(node: Declaration | undefined): boolean {
22854
+ function isJSConstructor(node: Node | undefined): boolean {
22853
22855
if (!node || !isInJSFile(node)) {
22854
22856
return false;
22855
22857
}
0 commit comments