Skip to content

Commit 1338b94

Browse files
author
Arthur Ozga
committed
Simplify rest parameter handling
1 parent 5e48e33 commit 1338b94

File tree

1 file changed

+9
-27
lines changed

1 file changed

+9
-27
lines changed

src/services/codefixes/helpers.ts

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -92,54 +92,36 @@ namespace ts.codefix {
9292
newSignatureDeclaration.parent = enclosingDeclaration;
9393
newSignatureDeclaration.name = signatures[0].getDeclaration().name;
9494

95-
let maxArgs = -1;
95+
let maxNonRestArgs = -1;
9696
let minArgumentCount = signatures[0].minArgumentCount;
9797
let hasRestParameter = false;
98-
let allMaxArgsAreRest = true;
9998
for (let i = 0; i < signatures.length; i++) {
10099
const sig = signatures[i];
101100
minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount);
102-
if (sig.parameters.length > maxArgs) {
103-
maxArgs = sig.parameters.length;
104-
allMaxArgsAreRest = sig.hasRestParameter;
105-
}
106-
else if (sig.parameters.length === maxArgs) {
107-
allMaxArgsAreRest = allMaxArgsAreRest && sig.hasRestParameter;
108-
}
109101
hasRestParameter = hasRestParameter || sig.hasRestParameter;
102+
const nonRestLength = sig.parameters.length - (sig.hasRestParameter ? 1 : 0);
103+
if (nonRestLength > maxNonRestArgs) {
104+
maxNonRestArgs = nonRestLength;
105+
}
110106
}
111107

112108
const anyTypeNode: TypeNode = createNode(SyntaxKind.AnyKeyword) as TypeNode;
113109
const optionalToken = createToken(SyntaxKind.QuestionToken);
114110

115111
newSignatureDeclaration.parameters = createNodeArray<ParameterDeclaration>();
116-
for (let i = 0; i < maxArgs - 1; i++) {
112+
for (let i = 0; i < maxNonRestArgs; i++) {
117113
const newParameter = createParameterDeclaration(i, minArgumentCount, anyTypeNode, newSignatureDeclaration);
118114
newSignatureDeclaration.parameters.push(newParameter);
119115
}
120116

121-
let lastParameter: ParameterDeclaration;
122117
if (hasRestParameter) {
123-
124118
const anyArrayTypeNode = createNode(SyntaxKind.ArrayType) as ArrayTypeNode;
125119
anyArrayTypeNode.elementType = anyTypeNode;
126120

127-
if (!allMaxArgsAreRest) {
128-
const newParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyTypeNode, newSignatureDeclaration);
129-
newSignatureDeclaration.parameters.push(newParameter);
130-
lastParameter = createParameterDeclaration(maxArgs, minArgumentCount, anyArrayTypeNode, newSignatureDeclaration);
131-
}
132-
else {
133-
lastParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyArrayTypeNode, newSignatureDeclaration);
134-
}
135-
136-
lastParameter.dotDotDotToken = createToken(SyntaxKind.DotDotDotToken);
121+
const restParameter = createParameterDeclaration(maxNonRestArgs, minArgumentCount, anyArrayTypeNode, newSignatureDeclaration);
122+
restParameter.dotDotDotToken = createToken(SyntaxKind.DotDotDotToken);
123+
newSignatureDeclaration.parameters.push(restParameter);
137124
}
138-
else {
139-
lastParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyTypeNode, newSignatureDeclaration);
140-
}
141-
142-
newSignatureDeclaration.parameters.push(lastParameter);
143125

144126
newSignatureDeclaration.type = anyTypeNode;
145127
newSignatureDeclaration.type.parent = newSignatureDeclaration;

0 commit comments

Comments
 (0)