Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 71bb928

Browse files
committedMar 13, 2020
refrect reviews
1 parent e6c8381 commit 71bb928

File tree

1 file changed

+19
-24
lines changed

1 file changed

+19
-24
lines changed
 

‎src/compiler/checker.ts

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24364,24 +24364,17 @@ 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;
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+
}
2438524378
return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount < getParameterCount(signature));
2438624379
}
2438724380
}
@@ -24405,6 +24398,11 @@ namespace ts {
2440524398
return true;
2440624399
}
2440724400

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+
2440824406
function hasCorrectTypeArgumentArity(signature: Signature, typeArguments: NodeArray<TypeNode> | undefined) {
2440924407
// If the user supplied type arguments, but the number of type arguments does not match
2441024408
// the declared number of type parameters, the call has an incorrect arity.
@@ -24855,18 +24853,15 @@ namespace ts {
2485524853
const spreadArgument = <SpreadElement>args[length - 1];
2485624854
const type = flowLoopCount ? checkExpression(spreadArgument.expression) : checkExpressionCached(spreadArgument.expression);
2485724855
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);
2485924860
}
2486024861
}
2486124862
return args;
2486224863
}
2486324864

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-
2487024865
/**
2487124866
* Returns the synthetic argument list for a decorator invocation.
2487224867
*/

0 commit comments

Comments
 (0)
Please sign in to comment.