@@ -15,7 +15,8 @@ namespace ts.refactor {
15
15
}
16
16
} ) ;
17
17
18
- function getRangeToMove ( context : RefactorContext ) : ReadonlyArray < Statement > | undefined {
18
+ interface RangeToMove { readonly toMove : ReadonlyArray < Statement > ; readonly afterLast : Statement | undefined ; }
19
+ function getRangeToMove ( context : RefactorContext ) : RangeToMove | undefined {
19
20
const { file } = context ;
20
21
const range = createTextRangeFromSpan ( getRefactorContextSpan ( context ) ) ;
21
22
const { statements } = file ;
@@ -25,7 +26,7 @@ namespace ts.refactor {
25
26
26
27
const startStatement = statements [ startNodeIndex ] ;
27
28
if ( isNamedDeclaration ( startStatement ) && startStatement . name && rangeContainsRange ( startStatement . name , range ) ) {
28
- return [ statements [ startNodeIndex ] ] ;
29
+ return { toMove : [ statements [ startNodeIndex ] ] , afterLast : statements [ startNodeIndex + 1 ] } ;
29
30
}
30
31
31
32
// Can't only partially include the start node or be partially into the next node
@@ -34,7 +35,10 @@ namespace ts.refactor {
34
35
// Can't be partially into the next node
35
36
if ( afterEndNodeIndex !== - 1 && ( afterEndNodeIndex === 0 || statements [ afterEndNodeIndex ] . getStart ( file ) < range . end ) ) return undefined ;
36
37
37
- return statements . slice ( startNodeIndex , afterEndNodeIndex === - 1 ? statements . length : afterEndNodeIndex ) ;
38
+ return {
39
+ toMove : statements . slice ( startNodeIndex , afterEndNodeIndex === - 1 ? statements . length : afterEndNodeIndex ) ,
40
+ afterLast : afterEndNodeIndex === - 1 ? undefined : statements [ afterEndNodeIndex ] ,
41
+ } ;
38
42
}
39
43
40
44
function doChange ( oldFile : SourceFile , program : Program , toMove : ToMove , changes : textChanges . ChangeTracker , host : LanguageServiceHost , preferences : UserPreferences ) : void {
@@ -47,14 +51,14 @@ namespace ts.refactor {
47
51
const newFileNameWithExtension = newModuleName + extension ;
48
52
49
53
// If previous file was global, this is easy.
50
- changes . createNewFile ( oldFile , combinePaths ( currentDirectory , newFileNameWithExtension ) , getNewStatements ( oldFile , usage , changes , toMove , program , newModuleName , preferences ) ) ;
54
+ changes . createNewFile ( oldFile , combinePaths ( currentDirectory , newFileNameWithExtension ) , getNewStatementsAndRemoveFromOldFile ( oldFile , usage , changes , toMove , program , newModuleName , preferences ) ) ;
51
55
52
56
addNewFileToTsconfig ( program , changes , oldFile . fileName , newFileNameWithExtension , hostGetCanonicalFileName ( host ) ) ;
53
57
}
54
58
55
59
interface StatementRange {
56
60
readonly first : Statement ;
57
- readonly last : Statement ;
61
+ readonly afterLast : Statement | undefined ;
58
62
}
59
63
interface ToMove {
60
64
readonly all : ReadonlyArray < Statement > ;
@@ -67,9 +71,10 @@ namespace ts.refactor {
67
71
if ( rangeToMove === undefined ) return undefined ;
68
72
const all : Statement [ ] = [ ] ;
69
73
const ranges : StatementRange [ ] = [ ] ;
70
- getRangesWhere ( rangeToMove , s => ! isPureImport ( s ) , ( start , afterEnd ) => {
71
- for ( let i = start ; i < afterEnd ; i ++ ) all . push ( rangeToMove [ i ] ) ;
72
- ranges . push ( { first : rangeToMove [ start ] , last : rangeToMove [ afterEnd - 1 ] } ) ;
74
+ const { toMove, afterLast } = rangeToMove ;
75
+ getRangesWhere ( toMove , s => ! isPureImport ( s ) , ( start , afterEndIndex ) => {
76
+ for ( let i = start ; i < afterEndIndex ; i ++ ) all . push ( toMove [ i ] ) ;
77
+ ranges . push ( { first : toMove [ start ] , afterLast } ) ;
73
78
} ) ;
74
79
return all . length === 0 ? undefined : { all, ranges } ;
75
80
}
@@ -102,7 +107,7 @@ namespace ts.refactor {
102
107
}
103
108
}
104
109
105
- function getNewStatements (
110
+ function getNewStatementsAndRemoveFromOldFile (
106
111
oldFile : SourceFile , usage : UsageInfo , changes : textChanges . ChangeTracker , toMove : ToMove , program : Program , newModuleName : string , preferences : UserPreferences ,
107
112
) : ReadonlyArray < Statement > {
108
113
const checker = program . getTypeChecker ( ) ;
@@ -130,8 +135,8 @@ namespace ts.refactor {
130
135
}
131
136
132
137
function deleteMovedStatements ( sourceFile : SourceFile , moved : ReadonlyArray < StatementRange > , changes : textChanges . ChangeTracker ) {
133
- for ( const { first, last } of moved ) {
134
- changes . deleteNodeRange ( sourceFile , first , last ) ;
138
+ for ( const { first, afterLast } of moved ) {
139
+ changes . deleteNodeRangeExcludingEnd ( sourceFile , first , afterLast ) ;
135
140
}
136
141
}
137
142
0 commit comments