@@ -24364,24 +24364,17 @@ namespace ts {
24364
24364
// If we are missing the close parenthesis, the call is incomplete.
24365
24365
callIsIncomplete = node.arguments.end === node.end;
24366
24366
24367
- // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range.
24367
+ // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range.
24368
24368
const firstSpreadArgIndex = getSpreadArgumentIndex(args);
24369
- const existSpreadArgIndex = firstSpreadArgIndex >= 0;
24370
- if (existSpreadArgIndex) {
24371
- if (firstSpreadArgIndex === args.length - 1) {
24372
- return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature));
24373
- }
24374
-
24375
- const totalCount = node.arguments.reduce((total, next) => {
24376
- if (isSpreadArgument(next)) {
24377
- const spreadArgment = <SpreadElement>next;
24378
- const type = flowLoopCount ? checkExpression(spreadArgment.expression) : checkExpressionCached(spreadArgment.expression);
24379
- if (isTupleType(type)) {
24380
- return total + getSyntheticExpressions(type, spreadArgment).length;
24381
- }
24382
- }
24383
- return total + 1;
24384
- }, 0);
24369
+ if (firstSpreadArgIndex >= 0) {
24370
+ if (firstSpreadArgIndex === args.length - 1) {
24371
+ return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature));
24372
+ }
24373
+
24374
+ let totalCount = countSpreadArgumentLength(<SpreadElement>args[firstSpreadArgIndex]);
24375
+ for (let i = firstSpreadArgIndex; i < args.length; i++) {
24376
+ totalCount += isSpreadArgument(args[i]) ? countSpreadArgumentLength(<SpreadElement>args[i]) : 1;
24377
+ }
24385
24378
return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount < getParameterCount(signature));
24386
24379
}
24387
24380
}
@@ -24405,6 +24398,11 @@ namespace ts {
24405
24398
return true;
24406
24399
}
24407
24400
24401
+ function countSpreadArgumentLength(argment: SpreadElement): number {
24402
+ const type = flowLoopCount ? checkExpression(argment.expression) : checkExpressionCached(argment.expression);
24403
+ return isTupleType(type) ? getTypeArguments(type).length : 1;
24404
+ }
24405
+
24408
24406
function hasCorrectTypeArgumentArity(signature: Signature, typeArguments: NodeArray<TypeNode> | undefined) {
24409
24407
// If the user supplied type arguments, but the number of type arguments does not match
24410
24408
// the declared number of type parameters, the call has an incorrect arity.
@@ -24855,18 +24853,15 @@ namespace ts {
24855
24853
const spreadArgument = <SpreadElement>args[length - 1];
24856
24854
const type = flowLoopCount ? checkExpression(spreadArgument.expression) : checkExpressionCached(spreadArgument.expression);
24857
24855
if (isTupleType(type)) {
24858
- return concatenate(args.slice(0, length - 1), getSyntheticExpressions(type, spreadArgument));
24856
+ const typeArguments = getTypeArguments(type);
24857
+ const restIndex = type.target.hasRestElement ? typeArguments.length - 1 : -1;
24858
+ const syntheticArgs = map(typeArguments, (t, i) => createSyntheticExpression(spreadArgument, t, /*isSpread*/ i === restIndex));
24859
+ return concatenate(args.slice(0, length - 1), syntheticArgs);
24859
24860
}
24860
24861
}
24861
24862
return args;
24862
24863
}
24863
24864
24864
- function getSyntheticExpressions(type: TupleTypeReference, spreadArgument: SpreadElement): SyntheticExpression[] {
24865
- const typeArguments = getTypeArguments(<TypeReference>type);
24866
- const restIndex = type.target.hasRestElement ? typeArguments.length - 1 : -1;
24867
- return map(typeArguments, (t, i) => createSyntheticExpression(spreadArgument, t, /*isSpread*/ i === restIndex));
24868
- }
24869
-
24870
24865
/**
24871
24866
* Returns the synthetic argument list for a decorator invocation.
24872
24867
*/
0 commit comments