@@ -24364,24 +24364,25 @@ namespace ts {
2436424364 // If we are missing the close parenthesis, the call is incomplete.
2436524365 callIsIncomplete = node.arguments.end === node.end;
2436624366
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.
2436824368 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 ;
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 = firstSpreadArgIndex + 1;
24375+ for (let i = firstSpreadArgIndex; i < args.length; i++) {
24376+ if (isSpreadArgument(args[i] )) {
24377+ const spreadArgment = <SpreadElement>args[i] ;
2437824378 const type = flowLoopCount ? checkExpression(spreadArgment.expression) : checkExpressionCached(spreadArgment.expression);
2437924379 if (isTupleType(type)) {
24380- return total + getSyntheticExpressions(type, spreadArgment).length;
24380+ totalCount += getTypeArguments(type).length;
24381+ continue;
2438124382 }
2438224383 }
24383- return total + 1;
24384- }, 0);
24384+ totalCount += 1;
24385+ }
2438524386 return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount < getParameterCount(signature));
2438624387 }
2438724388 }
@@ -24855,18 +24856,15 @@ namespace ts {
2485524856 const spreadArgument = <SpreadElement>args[length - 1];
2485624857 const type = flowLoopCount ? checkExpression(spreadArgument.expression) : checkExpressionCached(spreadArgument.expression);
2485724858 if (isTupleType(type)) {
24858- return concatenate(args.slice(0, length - 1), getSyntheticExpressions(type, spreadArgument));
24859+ const typeArguments = getTypeArguments(type);
24860+ const restIndex = type.target.hasRestElement ? typeArguments.length - 1 : -1;
24861+ const syntheticArgs = map(typeArguments, (t, i) => createSyntheticExpression(spreadArgument, t, /*isSpread*/ i === restIndex));
24862+ return concatenate(args.slice(0, length - 1), syntheticArgs);
2485924863 }
2486024864 }
2486124865 return args;
2486224866 }
2486324867
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-
2487024868 /**
2487124869 * Returns the synthetic argument list for a decorator invocation.
2487224870 */
0 commit comments