Skip to content

Commit 819a654

Browse files
author
Arthur Ozga
committed
Add tests and fix rest parameters
1 parent 97b3d7a commit 819a654

6 files changed

+55
-34
lines changed

src/services/codefixes/helpers.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,29 @@ namespace ts.codefix {
114114

115115
newSignatureDeclaration.parameters = createNodeArray<ParameterDeclaration>();
116116
for (let i = 0; i < maxArgs - 1; i++) {
117-
const newParameter = createParameterDeclaration(i, minArgumentCount, newSignatureDeclaration);
117+
const newParameter = createParameterDeclaration(i, minArgumentCount, anyTypeNode, newSignatureDeclaration);
118118
newSignatureDeclaration.parameters.push(newParameter);
119119
}
120120

121-
const lastParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, newSignatureDeclaration);
121+
let lastParameter: ParameterDeclaration;
122122
if (hasRestParameter) {
123-
lastParameter.dotDotDotToken = createToken(SyntaxKind.DotDotDotToken);
123+
124+
const anyArrayTypeNode = createNode(SyntaxKind.ArrayType) as ArrayTypeNode;
125+
anyArrayTypeNode.elementType = anyTypeNode;
124126

125127
if (!allMaxArgsAreRest) {
126-
const newParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, newSignatureDeclaration);
128+
const newParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyTypeNode, newSignatureDeclaration);
127129
newSignatureDeclaration.parameters.push(newParameter);
130+
lastParameter = createParameterDeclaration(maxArgs, minArgumentCount, anyArrayTypeNode, newSignatureDeclaration);
131+
}
132+
else {
133+
lastParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyArrayTypeNode, newSignatureDeclaration);
128134
}
135+
136+
lastParameter.dotDotDotToken = createToken(SyntaxKind.DotDotDotToken);
137+
}
138+
else {
139+
lastParameter = createParameterDeclaration(maxArgs - 1, minArgumentCount, anyTypeNode, newSignatureDeclaration);
129140
}
130141

131142
newSignatureDeclaration.parameters.push(lastParameter);
@@ -135,12 +146,12 @@ namespace ts.codefix {
135146

136147
return checker.getSignatureFromDeclaration(newSignatureDeclaration);
137148

138-
function createParameterDeclaration(index: number, minArgCount: number, enclosingSignatureDeclaration: SignatureDeclaration): ParameterDeclaration {
149+
function createParameterDeclaration(index: number, minArgCount: number, typeNode: TypeNode, enclosingSignatureDeclaration: SignatureDeclaration): ParameterDeclaration {
139150
const newParameter = createNode(SyntaxKind.Parameter) as ParameterDeclaration;
140151
newParameter.symbol = checker.createSymbol(SymbolFlags.FunctionScopedVariable, "arg" + index);
141152
newParameter.symbol.valueDeclaration = newParameter;
142153
newParameter.symbol.declarations = [newParameter];
143-
newParameter.type = anyTypeNode;
154+
newParameter.type = typeNode;
144155
newParameter.parent = enclosingSignatureDeclaration;
145156
if (index >= minArgCount) {
146157
newParameter.questionToken = optionalToken;

tests/cases/fourslash/codeFixUnImplementedInterfaceMissingMethod.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
/// <reference path='fourslash.ts' />
22

33
//// interface I {
4-
//// f(x: number, y: string)
4+
//// f(x: number, y: string): I
55
//// }
66
////
77
//// class C implements I {[|
88
//// |]}
99

1010
verify.rangeAfterCodeFix(`
11-
f(x: number,y: string){
11+
f(x: number,y: string): I {
1212
throw new Error('Method not implemented.');
1313
}
1414
`);

tests/cases/fourslash/codeFixUnImplementedInterfaceMissingMethodWithReturnType.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// method(a: number, ...b: string[]): boolean;
5+
//// method(a: string, ...b: number[]): Function;
6+
//// method(a: string): Function;
7+
//// }
8+
////
9+
//// class C implements I {[| |]}
10+
11+
verify.rangeAfterCodeFix(`
12+
method(a: number, ...b: string[]): boolean;
13+
method(a: string, ...b: number[]): Function;
14+
method(a: string): Function;
15+
method(arg0: any, ...arg1?: any[]) {
16+
throw new Error('Method not implemented.');
17+
}
18+
`);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// interface I {
4+
//// method(a: number, ...b: string[]): boolean;
5+
//// method(a: string, b: number): Function;
6+
//// method(a: string): Function;
7+
//// }
8+
////
9+
//// class C implements I {[| |]}
10+
11+
verify.rangeAfterCodeFix(`
12+
method(a: number, ...b: string[]): boolean;
13+
method(a: string, b: number): Function;
14+
method(a: string): Function;
15+
method(arg0: any, arg1?: any, ...arg2?: any[]) {
16+
throw new Error('Method not implemented.');
17+
}
18+
`);

0 commit comments

Comments
 (0)