@@ -35,6 +35,7 @@ import {
35
35
find ,
36
36
FindAllReferences ,
37
37
findIndex ,
38
+ findLastIndex ,
38
39
firstDefined ,
39
40
flatMap ,
40
41
forEachKey ,
@@ -51,6 +52,7 @@ import {
51
52
getRangesWhere ,
52
53
getRefactorContextSpan ,
53
54
getRelativePathFromFile ,
55
+ getSourceFileOfNode ,
54
56
getSynthesizedDeepClone ,
55
57
getUniqueName ,
56
58
hasJSFileExtension ,
@@ -69,6 +71,7 @@ import {
69
71
isDeclarationName ,
70
72
isExpressionStatement ,
71
73
isExternalModuleReference ,
74
+ isFunctionLikeDeclaration ,
72
75
isIdentifier ,
73
76
isImportDeclaration ,
74
77
isImportEqualsDeclaration ,
@@ -80,6 +83,7 @@ import {
80
83
isPropertyAssignment ,
81
84
isRequireCall ,
82
85
isSourceFile ,
86
+ isStatement ,
83
87
isStringLiteral ,
84
88
isStringLiteralLike ,
85
89
isValidTypeOnlyAliasUseSite ,
@@ -176,8 +180,8 @@ registerRefactor(refactorNameForMoveToFile, {
176
180
function doChange ( context : RefactorContext , oldFile : SourceFile , targetFile : string , program : Program , toMove : ToMove , changes : textChanges . ChangeTracker , host : LanguageServiceHost , preferences : UserPreferences ) : void {
177
181
const checker = program . getTypeChecker ( ) ;
178
182
const usage = getUsageInfo ( oldFile , toMove . all , checker ) ;
179
- //For a new file or an existing blank target file
180
- if ( ! host . fileExists ( targetFile ) || host . fileExists ( targetFile ) && program . getSourceFile ( targetFile ) ?. statements . length === 0 ) {
183
+ //For a new file
184
+ if ( ! host . fileExists ( targetFile ) ) {
181
185
changes . createNewFile ( oldFile , targetFile , getNewStatementsAndRemoveFromOldFile ( oldFile , targetFile , usage , changes , toMove , program , host , preferences ) ) ;
182
186
addNewFileToTsconfig ( program , changes , oldFile . fileName , targetFile , hostGetCanonicalFileName ( host ) ) ;
183
187
}
@@ -189,7 +193,15 @@ function doChange(context: RefactorContext, oldFile: SourceFile, targetFile: str
189
193
}
190
194
191
195
function getNewStatementsAndRemoveFromOldFile (
192
- oldFile : SourceFile , targetFile : string | SourceFile , usage : UsageInfo , changes : textChanges . ChangeTracker , toMove : ToMove , program : Program , host : LanguageServiceHost , preferences : UserPreferences , importAdder ?: codefix . ImportAdder
196
+ oldFile : SourceFile ,
197
+ targetFile : string | SourceFile ,
198
+ usage : UsageInfo ,
199
+ changes : textChanges . ChangeTracker ,
200
+ toMove : ToMove ,
201
+ program : Program ,
202
+ host : LanguageServiceHost ,
203
+ preferences : UserPreferences ,
204
+ importAdder ?: codefix . ImportAdder
193
205
) {
194
206
const checker = program . getTypeChecker ( ) ;
195
207
const prologueDirectives = takeWhile ( oldFile . statements , isPrologueDirective ) ;
@@ -218,6 +230,9 @@ function getNewStatementsAndRemoveFromOldFile(
218
230
if ( targetFile . statements . length > 0 ) {
219
231
changes . insertNodesAfter ( targetFile , targetFile . statements [ targetFile . statements . length - 1 ] , body ) ;
220
232
}
233
+ else {
234
+ changes . insertNodesAtEndOfFile ( targetFile , body , /*blankLineBetween*/ false ) ;
235
+ }
221
236
if ( imports . length > 0 ) {
222
237
insertImports ( changes , targetFile , imports , /*blankLineBetween*/ true , preferences ) ;
223
238
}
@@ -890,6 +905,11 @@ function getRangeToMove(context: RefactorContext): RangeToMove | undefined {
890
905
return { toMove : [ statements [ startNodeIndex ] ] , afterLast : statements [ startNodeIndex + 1 ] } ;
891
906
}
892
907
908
+ const overloadRangeToMove = getOverloadRangeToMove ( file , startStatement ) ;
909
+ if ( overloadRangeToMove ) {
910
+ return overloadRangeToMove ;
911
+ }
912
+
893
913
// Can't only partially include the start node or be partially into the next node
894
914
if ( range . pos > startStatement . getStart ( file ) ) return undefined ;
895
915
const afterEndNodeIndex = findIndex ( statements , s => s . end > range . end , startNodeIndex ) ;
@@ -1109,4 +1129,16 @@ function isNonVariableTopLevelDeclaration(node: Node): node is NonVariableTopLev
1109
1129
}
1110
1130
}
1111
1131
1112
-
1132
+ function getOverloadRangeToMove ( sourceFile : SourceFile , statement : Statement ) {
1133
+ if ( isFunctionLikeDeclaration ( statement ) ) {
1134
+ const declarations = statement . symbol . declarations ;
1135
+ if ( declarations === undefined || length ( declarations ) <= 1 || ! contains ( declarations , statement ) ) {
1136
+ return undefined ;
1137
+ }
1138
+ const lastDecl = declarations [ length ( declarations ) - 1 ] ;
1139
+ const statementsToMove = mapDefined ( declarations , d => getSourceFileOfNode ( d ) === sourceFile && isStatement ( d ) ? d : undefined ) ;
1140
+ const end = findLastIndex ( sourceFile . statements , s => s . end > lastDecl . end ) ;
1141
+ return { toMove : statementsToMove , afterLast : end >= 0 ? sourceFile . statements [ end ] : undefined } ;
1142
+ }
1143
+ return undefined ;
1144
+ }
0 commit comments