@@ -169,10 +169,10 @@ namespace ts {
169
169
const noConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
170
170
const circularConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
171
171
172
- const anySignature = createSignature(undefined, undefined, 0, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
173
- const unknownSignature = createSignature(undefined, undefined, 0, undefined, emptyArray, unknownType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
174
- const resolvingSignature = createSignature(undefined, undefined, 0, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
175
- const silentNeverSignature = createSignature(undefined, undefined, 0, undefined, emptyArray, silentNeverType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
172
+ const anySignature = createSignature(undefined, undefined, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
173
+ const unknownSignature = createSignature(undefined, undefined, undefined, emptyArray, unknownType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
174
+ const resolvingSignature = createSignature(undefined, undefined, undefined, emptyArray, anyType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
175
+ const silentNeverSignature = createSignature(undefined, undefined, undefined, emptyArray, silentNeverType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false);
176
176
177
177
const enumNumberIndexInfo = createIndexInfo(stringType, /*isReadonly*/ true);
178
178
@@ -3845,7 +3845,7 @@ namespace ts {
3845
3845
function getConstructorsForTypeArguments(type: Type, typeArgumentNodes: TypeNode[]): Signature[] {
3846
3846
const typeArgCount = length(typeArgumentNodes);
3847
3847
return filter(getSignaturesOfType(type, SignatureKind.Construct),
3848
- sig => typeArgCount >= sig.minTypeArgumentCount && typeArgCount <= length(sig.typeParameters));
3848
+ sig => typeArgCount >= getMinTypeArgumentCount( sig.typeParameters) && typeArgCount <= length(sig.typeParameters));
3849
3849
}
3850
3850
3851
3851
function getInstantiatedConstructorsForTypeArguments(type: Type, typeArgumentNodes: TypeNode[]): Signature[] {
@@ -4059,7 +4059,6 @@ namespace ts {
4059
4059
type.typeParameters = concatenate(outerTypeParameters, localTypeParameters);
4060
4060
type.outerTypeParameters = outerTypeParameters;
4061
4061
type.localTypeParameters = localTypeParameters;
4062
- type.minTypeArgumentCount = getMinTypeArgumentCount(localTypeParameters);
4063
4062
(<GenericType>type).instantiations = createMap<TypeReference>();
4064
4063
(<GenericType>type).instantiations.set(getTypeListId(type.typeParameters), <GenericType>type);
4065
4064
(<GenericType>type).target = <GenericType>type;
@@ -4103,7 +4102,6 @@ namespace ts {
4103
4102
// Initialize the instantiation cache for generic type aliases. The declared type corresponds to
4104
4103
// an instantiation of the type alias with the type parameters supplied as type arguments.
4105
4104
links.typeParameters = typeParameters;
4106
- links.minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
4107
4105
links.instantiations = createMap<Type>();
4108
4106
links.instantiations.set(getTypeListId(typeParameters), type);
4109
4107
}
@@ -4417,12 +4415,11 @@ namespace ts {
4417
4415
resolveObjectTypeMembers(type, source, typeParameters, typeArguments);
4418
4416
}
4419
4417
4420
- function createSignature(declaration: SignatureDeclaration, typeParameters: TypeParameter[], minTypeArgumentCount: number, thisParameter: Symbol | undefined, parameters: Symbol[],
4418
+ function createSignature(declaration: SignatureDeclaration, typeParameters: TypeParameter[], thisParameter: Symbol | undefined, parameters: Symbol[],
4421
4419
resolvedReturnType: Type, typePredicate: TypePredicate, minArgumentCount: number, hasRestParameter: boolean, hasLiteralTypes: boolean): Signature {
4422
4420
const sig = new Signature(checker);
4423
4421
sig.declaration = declaration;
4424
4422
sig.typeParameters = typeParameters;
4425
- sig.minTypeArgumentCount = minTypeArgumentCount;
4426
4423
sig.parameters = parameters;
4427
4424
sig.thisParameter = thisParameter;
4428
4425
sig.resolvedReturnType = resolvedReturnType;
@@ -4434,27 +4431,26 @@ namespace ts {
4434
4431
}
4435
4432
4436
4433
function cloneSignature(sig: Signature): Signature {
4437
- return createSignature(sig.declaration, sig.typeParameters, sig.minTypeArgumentCount, sig. thisParameter, sig.parameters, sig.resolvedReturnType,
4434
+ return createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, sig.resolvedReturnType,
4438
4435
sig.typePredicate, sig.minArgumentCount, sig.hasRestParameter, sig.hasLiteralTypes);
4439
4436
}
4440
4437
4441
4438
function getDefaultConstructSignatures(classType: InterfaceType): Signature[] {
4442
4439
const baseConstructorType = getBaseConstructorTypeOfClass(classType);
4443
4440
const baseSignatures = getSignaturesOfType(baseConstructorType, SignatureKind.Construct);
4444
4441
if (baseSignatures.length === 0) {
4445
- return [createSignature(undefined, classType.localTypeParameters, classType.minTypeArgumentCount, undefined, emptyArray, classType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false)];
4442
+ return [createSignature(undefined, classType.localTypeParameters, undefined, emptyArray, classType, /*typePredicate*/ undefined, 0, /*hasRestParameter*/ false, /*hasLiteralTypes*/ false)];
4446
4443
}
4447
4444
const baseTypeNode = getBaseTypeNodeOfClass(classType);
4448
4445
const typeArguments = map(baseTypeNode.typeArguments, getTypeFromTypeNode);
4449
4446
const typeArgCount = length(typeArguments);
4450
4447
const result: Signature[] = [];
4451
4448
for (const baseSig of baseSignatures) {
4452
- const minTypeArgumentCount = baseSig.minTypeArgumentCount ;
4449
+ const minTypeArgumentCount = getMinTypeArgumentCount( baseSig.typeParameters) ;
4453
4450
const typeParamCount = length(baseSig.typeParameters);
4454
4451
if (typeArgCount >= minTypeArgumentCount && typeArgCount <= typeParamCount) {
4455
4452
const sig = typeParamCount ? createSignatureInstantiation(baseSig, fillMissingTypeArguments(typeArguments, baseSig.typeParameters, minTypeArgumentCount)) : cloneSignature(baseSig);
4456
4453
sig.typeParameters = classType.localTypeParameters;
4457
- sig.minTypeArgumentCount = classType.minTypeArgumentCount;
4458
4454
sig.resolvedReturnType = classType;
4459
4455
result.push(sig);
4460
4456
}
@@ -5320,7 +5316,7 @@ namespace ts {
5320
5316
createTypePredicateFromTypePredicateNode(declaration.type as TypePredicateNode) :
5321
5317
undefined;
5322
5318
5323
- links.resolvedSignature = createSignature(declaration, typeParameters, getMinTypeArgumentCount(typeParameters), thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestParameter(declaration), hasLiteralTypes);
5319
+ links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestParameter(declaration), hasLiteralTypes);
5324
5320
}
5325
5321
return links.resolvedSignature;
5326
5322
}
@@ -5451,7 +5447,7 @@ namespace ts {
5451
5447
}
5452
5448
5453
5449
function getSignatureInstantiation(signature: Signature, typeArguments: Type[]): Signature {
5454
- typeArguments = fillMissingTypeArguments(typeArguments, signature.typeParameters, signature.minTypeArgumentCount );
5450
+ typeArguments = fillMissingTypeArguments(typeArguments, signature.typeParameters, getMinTypeArgumentCount( signature.typeParameters) );
5455
5451
const instantiations = signature.instantiations || (signature.instantiations = createMap<Signature>());
5456
5452
const id = getTypeListId(typeArguments);
5457
5453
let instantiation = instantiations.get(id);
@@ -5618,20 +5614,21 @@ namespace ts {
5618
5614
const typeParameters = type.localTypeParameters;
5619
5615
if (typeParameters) {
5620
5616
const numTypeArguments = length(node.typeArguments);
5621
- if (numTypeArguments < type.minTypeArgumentCount || numTypeArguments > typeParameters.length) {
5617
+ const minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
5618
+ if (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length) {
5622
5619
error(node,
5623
- type. minTypeArgumentCount === typeParameters.length
5620
+ minTypeArgumentCount === typeParameters.length
5624
5621
? Diagnostics.Generic_type_0_requires_1_type_argument_s
5625
5622
: Diagnostics.Generic_type_0_requires_between_1_and_2_type_arguments,
5626
5623
typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType),
5627
- type. minTypeArgumentCount,
5624
+ minTypeArgumentCount,
5628
5625
typeParameters.length);
5629
5626
return unknownType;
5630
5627
}
5631
5628
// In a type reference, the outer type parameters of the referenced class or interface are automatically
5632
5629
// supplied as type arguments and the type reference only specifies arguments for the local type parameters
5633
5630
// of the class or interface.
5634
- const typeArguments = concatenate(type.outerTypeParameters, fillMissingTypeArguments(map(node.typeArguments, getTypeFromTypeNode), typeParameters, type. minTypeArgumentCount));
5631
+ const typeArguments = concatenate(type.outerTypeParameters, fillMissingTypeArguments(map(node.typeArguments, getTypeFromTypeNode), typeParameters, minTypeArgumentCount));
5635
5632
return createTypeReference(<GenericType>type, typeArguments);
5636
5633
}
5637
5634
if (node.typeArguments) {
@@ -5648,7 +5645,7 @@ namespace ts {
5648
5645
const id = getTypeListId(typeArguments);
5649
5646
let instantiation = links.instantiations.get(id);
5650
5647
if (!instantiation) {
5651
- links.instantiations.set(id, instantiation = instantiateTypeNoAlias(type, createTypeMapper(typeParameters, fillMissingTypeArguments(typeArguments, typeParameters, links.minTypeArgumentCount ))));
5648
+ links.instantiations.set(id, instantiation = instantiateTypeNoAlias(type, createTypeMapper(typeParameters, fillMissingTypeArguments(typeArguments, typeParameters, getMinTypeArgumentCount(typeParameters) ))));
5652
5649
}
5653
5650
return instantiation;
5654
5651
}
@@ -5658,9 +5655,10 @@ namespace ts {
5658
5655
// declared type. Instantiations are cached using the type identities of the type arguments as the key.
5659
5656
function getTypeFromTypeAliasReference(node: TypeReferenceNode | ExpressionWithTypeArguments | JSDocTypeReference, symbol: Symbol): Type {
5660
5657
const type = getDeclaredTypeOfSymbol(symbol);
5661
- const { typeParameters, minTypeArgumentCount } = getSymbolLinks(symbol);
5658
+ const typeParameters = getSymbolLinks(symbol).typeParameters ;
5662
5659
if (typeParameters) {
5663
5660
const numTypeArguments = length(node.typeArguments);
5661
+ const minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
5664
5662
if (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length) {
5665
5663
error(node,
5666
5664
minTypeArgumentCount === typeParameters.length
@@ -5897,7 +5895,6 @@ namespace ts {
5897
5895
type.typeParameters = typeParameters;
5898
5896
type.outerTypeParameters = undefined;
5899
5897
type.localTypeParameters = typeParameters;
5900
- type.minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
5901
5898
type.instantiations = createMap<TypeReference>();
5902
5899
type.instantiations.set(getTypeListId(type.typeParameters), <GenericType>type);
5903
5900
type.target = <GenericType>type;
@@ -6805,7 +6802,7 @@ namespace ts {
6805
6802
if (signature.typePredicate) {
6806
6803
freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper);
6807
6804
}
6808
- const result = createSignature(signature.declaration, freshTypeParameters, signature.minTypeArgumentCount,
6805
+ const result = createSignature(signature.declaration, freshTypeParameters,
6809
6806
signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper),
6810
6807
instantiateList(signature.parameters, mapper, instantiateSymbol),
6811
6808
instantiateType(signature.resolvedReturnType, mapper),
@@ -12937,8 +12934,9 @@ namespace ts {
12937
12934
// If the user supplied type arguments, but the number of type arguments does not match
12938
12935
// the declared number of type parameters, the call has an incorrect arity.
12939
12936
const numTypeParameters = length(signature.typeParameters);
12937
+ const minTypeArgumentCount = getMinTypeArgumentCount(signature.typeParameters);
12940
12938
const hasRightNumberOfTypeArgs = !typeArguments ||
12941
- (typeArguments.length >= signature. minTypeArgumentCount && typeArguments.length <= numTypeParameters);
12939
+ (typeArguments.length >= minTypeArgumentCount && typeArguments.length <= numTypeParameters);
12942
12940
if (!hasRightNumberOfTypeArgs) {
12943
12941
return false;
12944
12942
}
@@ -13637,7 +13635,7 @@ namespace ts {
13637
13635
if (candidate.typeParameters) {
13638
13636
let typeArgumentTypes: Type[] | undefined;
13639
13637
if (typeArguments) {
13640
- typeArgumentTypes = fillMissingTypeArguments(map(typeArguments, getTypeFromTypeNode), candidate.typeParameters, candidate.minTypeArgumentCount );
13638
+ typeArgumentTypes = fillMissingTypeArguments(map(typeArguments, getTypeFromTypeNode), candidate.typeParameters, getMinTypeArgumentCount( candidate.typeParameters) );
13641
13639
typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, /*reportErrors*/ false);
13642
13640
}
13643
13641
else {
@@ -16201,7 +16199,8 @@ namespace ts {
16201
16199
checkDecorators(node);
16202
16200
}
16203
16201
16204
- function checkTypeArgumentConstraints(typeParameters: TypeParameter[], typeArgumentNodes: TypeNode[], minTypeArgumentCount: number): boolean {
16202
+ function checkTypeArgumentConstraints(typeParameters: TypeParameter[], typeArgumentNodes: TypeNode[]): boolean {
16203
+ const minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
16205
16204
let typeArguments: Type[];
16206
16205
let mapper: TypeMapper;
16207
16206
let result = true;
@@ -16233,8 +16232,7 @@ namespace ts {
16233
16232
if (produceDiagnostics) {
16234
16233
const symbol = getNodeLinks(node).resolvedSymbol;
16235
16234
const typeParameters = symbol.flags & SymbolFlags.TypeAlias ? getSymbolLinks(symbol).typeParameters : (<TypeReference>type).target.localTypeParameters;
16236
- const minTypeArgumentCount = symbol.flags & SymbolFlags.TypeAlias ? getSymbolLinks(symbol).minTypeArgumentCount : (<TypeReference>type).target.minTypeArgumentCount;
16237
- checkTypeArgumentConstraints(typeParameters, node.typeArguments, minTypeArgumentCount);
16235
+ checkTypeArgumentConstraints(typeParameters, node.typeArguments);
16238
16236
}
16239
16237
}
16240
16238
if (type.flags & TypeFlags.Enum && !(<EnumType>type).memberTypes && getNodeLinks(node).resolvedSymbol.flags & SymbolFlags.EnumMember) {
@@ -18482,8 +18480,9 @@ namespace ts {
18482
18480
// Resolve the type parameters and minimum type argument count for all declarations
18483
18481
resolveTypeParametersOfClassOrInterface(symbol);
18484
18482
18485
- const { typeParameters, minTypeArgumentCount } = getSymbolLinks(symbol);
18483
+ const typeParameters = getSymbolLinks(symbol).typeParameters ;
18486
18484
const maxTypeArgumentCount = length(typeParameters);
18485
+ const minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
18487
18486
const numTypeParameters = length(node.typeParameters);
18488
18487
18489
18488
// If this declaration has too few or too many type parameters, we report an error
@@ -18581,7 +18580,6 @@ namespace ts {
18581
18580
typeParameters.length = maxTypeArgumentCount;
18582
18581
}
18583
18582
links.typeParameters = typeParameters || emptyArray;
18584
- links.minTypeArgumentCount = minTypeArgumentCount;
18585
18583
}
18586
18584
}
18587
18585
@@ -18645,7 +18643,7 @@ namespace ts {
18645
18643
if (baseTypeNode.typeArguments) {
18646
18644
forEach(baseTypeNode.typeArguments, checkSourceElement);
18647
18645
for (const constructor of getConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments)) {
18648
- if (!checkTypeArgumentConstraints(constructor.typeParameters, baseTypeNode.typeArguments, constructor.minTypeArgumentCount )) {
18646
+ if (!checkTypeArgumentConstraints(constructor.typeParameters, baseTypeNode.typeArguments)) {
18649
18647
break;
18650
18648
}
18651
18649
}
0 commit comments