2
2
namespace ts . codefix {
3
3
const fixId = "addMissingConstInForLoop" ;
4
4
const errorCodes = [ Diagnostics . Cannot_find_name_0 . code ] ;
5
+
5
6
registerCodeFix ( {
6
7
errorCodes,
7
8
getCodeActions : ( context ) => {
@@ -11,16 +12,20 @@ namespace ts.codefix {
11
12
}
12
13
} ,
13
14
fixIds : [ fixId ] ,
14
- getAllCodeActions : context => codeFixAll ( context , errorCodes , ( changes , diag ) => makeChange ( changes , diag . file , diag . start ) ) ,
15
+ getAllCodeActions : context => {
16
+ const fixedNodes = new NodeSet ( ) ;
17
+ return codeFixAll ( context , errorCodes , ( changes , diag ) => makeChange ( changes , diag . file , diag . start , fixedNodes ) ) ;
18
+ } ,
15
19
} ) ;
16
20
17
- function makeChange ( changeTracker : textChanges . ChangeTracker , sourceFile : SourceFile , pos : number ) {
21
+ function makeChange ( changeTracker : textChanges . ChangeTracker , sourceFile : SourceFile , pos : number , fixedNodes ?: NodeSet < Node > ) {
18
22
const forInitializer = findAncestor ( getTokenAtPosition ( sourceFile , pos ) , node =>
19
23
isForInOrOfStatement ( node . parent ) ? node . parent . initializer === node
20
24
: isPossiblyPartOfDestructuring ( node ) ? false : "quit" ) ;
21
25
if ( ! forInitializer ) return ;
22
- if ( alreadyContainsConstCodeFixForInitializer ( changeTracker , forInitializer , sourceFile ) ) return ;
23
- changeTracker . insertNodeBefore ( sourceFile , forInitializer , createToken ( SyntaxKind . ConstKeyword ) ) ;
26
+ if ( ! fixedNodes || fixedNodes . tryAdd ( forInitializer ) ) {
27
+ changeTracker . insertNodeBefore ( sourceFile , forInitializer , createToken ( SyntaxKind . ConstKeyword ) ) ;
28
+ }
24
29
}
25
30
26
31
function isPossiblyPartOfDestructuring ( node : Node ) : boolean {
@@ -35,19 +40,4 @@ namespace ts.codefix {
35
40
return false ;
36
41
}
37
42
}
38
-
39
- function alreadyContainsConstCodeFixForInitializer ( changeTracker : textChanges . ChangeTracker , forInitializer : Node , sourceFile : SourceFile ) : boolean {
40
- return changeTracker . getChanges ( ) . some ( change => {
41
- const textChanges = change . textChanges ;
42
- if ( ! textChanges ) return false ;
43
- return textChanges . some ( textChange => {
44
- if ( textChange . newText !== "const " ) return false ;
45
- const changeStart = textChange . span . start ;
46
- const changeEnd = changeStart + textChange . span . length ;
47
- const initStart = forInitializer . getStart ( sourceFile ) ;
48
- const initEnd = forInitializer . getEnd ( ) ;
49
- return initStart <= changeEnd && changeStart <= initEnd ;
50
- } ) ;
51
- } ) ;
52
- }
53
43
}
0 commit comments