1
1
import {
2
+ createRange ,
2
3
Debug ,
3
4
Diagnostics ,
4
5
factory ,
6
+ findNextToken ,
5
7
getTokenAtPosition ,
6
8
Identifier ,
9
+ isArrayBindingPattern ,
10
+ isArrayTypeNode ,
7
11
isParameter ,
12
+ ParameterDeclaration ,
8
13
SourceFile ,
14
+ SyntaxKind ,
9
15
textChanges ,
16
+ TypeNode ,
10
17
} from "../_namespaces/ts" ;
11
18
import {
12
19
codeFixAll ,
@@ -26,8 +33,8 @@ registerCodeFix({
26
33
getAllCodeActions : context => codeFixAll ( context , errorCodes , ( changes , diag ) => makeChange ( changes , diag . file , diag . start ) ) ,
27
34
} ) ;
28
35
29
- function makeChange ( changeTracker : textChanges . ChangeTracker , sourceFile : SourceFile , pos : number ) {
30
- const token = getTokenAtPosition ( sourceFile , pos ) ;
36
+ function makeChange ( changeTracker : textChanges . ChangeTracker , sourceFile : SourceFile , start : number ) {
37
+ const token = getTokenAtPosition ( sourceFile , start ) ;
31
38
const param = token . parent ;
32
39
if ( ! isParameter ( param ) ) {
33
40
return Debug . fail ( "Tried to add a parameter name to a non-parameter: " + Debug . formatSyntaxKind ( token . kind ) ) ;
@@ -37,14 +44,33 @@ function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: Source
37
44
Debug . assert ( ! param . type , "Tried to add a parameter name to a parameter that already had one." ) ;
38
45
Debug . assert ( i > - 1 , "Parameter not found in parent parameter list." ) ;
39
46
40
- const typeNode = factory . createTypeReferenceNode ( param . name as Identifier , /*typeArguments*/ undefined ) ;
47
+ let end = param . name . getEnd ( ) ;
48
+ let typeNode : TypeNode = factory . createTypeReferenceNode ( param . name as Identifier , /*typeArguments*/ undefined ) ;
49
+ let nextParam = tryGetNextParam ( sourceFile , param ) ;
50
+ while ( nextParam ) {
51
+ typeNode = factory . createArrayTypeNode ( typeNode ) ;
52
+ end = nextParam . getEnd ( ) ;
53
+ nextParam = tryGetNextParam ( sourceFile , nextParam ) ;
54
+ }
55
+
41
56
const replacement = factory . createParameterDeclaration (
42
57
param . modifiers ,
43
58
param . dotDotDotToken ,
44
59
"arg" + i ,
45
60
param . questionToken ,
46
- param . dotDotDotToken ? factory . createArrayTypeNode ( typeNode ) : typeNode ,
61
+ param . dotDotDotToken && ! isArrayTypeNode ( typeNode ) ? factory . createArrayTypeNode ( typeNode ) : typeNode ,
47
62
param . initializer ,
48
63
) ;
49
- changeTracker . replaceNode ( sourceFile , param , replacement ) ;
64
+ changeTracker . replaceRange ( sourceFile , createRange ( param . getStart ( sourceFile ) , end ) , replacement ) ;
65
+ }
66
+
67
+ function tryGetNextParam ( sourceFile : SourceFile , param : ParameterDeclaration ) {
68
+ const nextToken = findNextToken ( param . name , param . parent , sourceFile ) ;
69
+ if (
70
+ nextToken && nextToken . kind === SyntaxKind . OpenBracketToken
71
+ && isArrayBindingPattern ( nextToken . parent ) && isParameter ( nextToken . parent . parent )
72
+ ) {
73
+ return nextToken . parent . parent ;
74
+ }
75
+ return undefined ;
50
76
}
0 commit comments