Skip to content

Commit c8da9d5

Browse files
TypeScript Botgabritto
TypeScript Bot
andauthored
🤖 Pick PR #54358 (Don't use text change's `createNewF...) into release-5.1 (#54444)
Co-authored-by: Gabriela Araujo Britto <[email protected]>
1 parent cede745 commit c8da9d5

File tree

9 files changed

+104
-15
lines changed

9 files changed

+104
-15
lines changed

Diff for: ‎src/harness/client.ts

+32-6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
ImplementationLocation,
3737
InlayHint,
3838
InlayHintKind,
39+
InteractiveRefactorArguments,
3940
isString,
4041
JSDocTagInfo,
4142
LanguageService,
@@ -52,6 +53,7 @@ import {
5253
Program,
5354
QuickInfo,
5455
RefactorEditInfo,
56+
RefactorTriggerReason,
5557
ReferencedSymbol,
5658
ReferenceEntry,
5759
RenameInfo,
@@ -787,11 +789,25 @@ export class SessionClient implements LanguageService {
787789
return { file, line, offset, endLine, endOffset };
788790
}
789791

790-
getApplicableRefactors(fileName: string, positionOrRange: number | TextRange): ApplicableRefactorInfo[] {
791-
const args = this.createFileLocationOrRangeRequestArgs(positionOrRange, fileName);
792-
792+
getApplicableRefactors(
793+
fileName: string,
794+
positionOrRange: number | TextRange,
795+
preferences: UserPreferences | undefined,
796+
triggerReason?: RefactorTriggerReason,
797+
kind?: string,
798+
includeInteractiveActions?: boolean): ApplicableRefactorInfo[] {
799+
if (preferences) { // Temporarily set preferences
800+
this.configure(preferences);
801+
}
802+
const args: protocol.GetApplicableRefactorsRequestArgs = this.createFileLocationOrRangeRequestArgs(positionOrRange, fileName);
803+
args.triggerReason = triggerReason;
804+
args.kind = kind;
805+
args.includeInteractiveActions = includeInteractiveActions;
793806
const request = this.processRequest<protocol.GetApplicableRefactorsRequest>(protocol.CommandTypes.GetApplicableRefactors, args);
794807
const response = this.processResponse<protocol.GetApplicableRefactorsResponse>(request);
808+
if (preferences) { // Restore preferences
809+
this.configure(this.preferences || {});
810+
}
795811
return response.body!; // TODO: GH#18217
796812
}
797813

@@ -808,11 +824,17 @@ export class SessionClient implements LanguageService {
808824
_formatOptions: FormatCodeSettings,
809825
positionOrRange: number | TextRange,
810826
refactorName: string,
811-
actionName: string): RefactorEditInfo {
812-
813-
const args = this.createFileLocationOrRangeRequestArgs(positionOrRange, fileName) as protocol.GetEditsForRefactorRequestArgs;
827+
actionName: string,
828+
preferences: UserPreferences | undefined,
829+
interactiveRefactorArguments?: InteractiveRefactorArguments): RefactorEditInfo {
830+
if (preferences) { // Temporarily set preferences
831+
this.configure(preferences);
832+
}
833+
const args =
834+
this.createFileLocationOrRangeRequestArgs(positionOrRange, fileName) as protocol.GetEditsForRefactorRequestArgs;
814835
args.refactor = refactorName;
815836
args.action = actionName;
837+
args.interactiveRefactorArguments = interactiveRefactorArguments;
816838

817839
const request = this.processRequest<protocol.GetEditsForRefactorRequest>(protocol.CommandTypes.GetEditsForRefactor, args);
818840
const response = this.processResponse<protocol.GetEditsForRefactorResponse>(request);
@@ -829,6 +851,10 @@ export class SessionClient implements LanguageService {
829851
renameLocation = this.lineOffsetToPosition(renameFilename, response.body.renameLocation!);
830852
}
831853

854+
if (preferences) { // Restore preferences
855+
this.configure(this.preferences || {});
856+
}
857+
832858
return {
833859
edits,
834860
renameFilename,

Diff for: ‎src/services/refactors/moveToFile.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ registerRefactor(refactorNameForMoveToFile, {
176176
function doChange(context: RefactorContext, oldFile: SourceFile, targetFile: string, program: Program, toMove: ToMove, changes: textChanges.ChangeTracker, host: LanguageServiceHost, preferences: UserPreferences): void {
177177
const checker = program.getTypeChecker();
178178
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) {
179+
//For a new file
180+
if (!host.fileExists(targetFile)) {
181181
changes.createNewFile(oldFile, targetFile, getNewStatementsAndRemoveFromOldFile(oldFile, targetFile, usage, changes, toMove, program, host, preferences));
182182
addNewFileToTsconfig(program, changes, oldFile.fileName, targetFile, hostGetCanonicalFileName(host));
183183
}
@@ -189,7 +189,15 @@ function doChange(context: RefactorContext, oldFile: SourceFile, targetFile: str
189189
}
190190

191191
function getNewStatementsAndRemoveFromOldFile(
192-
oldFile: SourceFile, targetFile: string | SourceFile, usage: UsageInfo, changes: textChanges.ChangeTracker, toMove: ToMove, program: Program, host: LanguageServiceHost, preferences: UserPreferences, importAdder?: codefix.ImportAdder
192+
oldFile: SourceFile,
193+
targetFile: string | SourceFile,
194+
usage: UsageInfo,
195+
changes: textChanges.ChangeTracker,
196+
toMove: ToMove,
197+
program: Program,
198+
host: LanguageServiceHost,
199+
preferences: UserPreferences,
200+
importAdder?: codefix.ImportAdder
193201
) {
194202
const checker = program.getTypeChecker();
195203
const prologueDirectives = takeWhile(oldFile.statements, isPrologueDirective);
@@ -218,6 +226,9 @@ function getNewStatementsAndRemoveFromOldFile(
218226
if (targetFile.statements.length > 0) {
219227
changes.insertNodesAfter(targetFile, targetFile.statements[targetFile.statements.length - 1], body);
220228
}
229+
else {
230+
changes.insertNodesAtEndOfFile(targetFile, body, /*blankLineBetween*/ false);
231+
}
221232
if (imports.length > 0) {
222233
insertImports(changes, targetFile, imports, /*blankLineBetween*/ true, preferences);
223234
}

Diff for: ‎src/services/textChanges.ts

+19
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,25 @@ export class ChangeTracker {
631631
}
632632
}
633633

634+
public insertNodesAtEndOfFile(
635+
sourceFile: SourceFile,
636+
newNodes: readonly Statement[],
637+
blankLineBetween: boolean): void {
638+
this.insertAtEndOfFile(sourceFile, newNodes, blankLineBetween);
639+
}
640+
641+
private insertAtEndOfFile(
642+
sourceFile: SourceFile,
643+
insert: readonly Statement[],
644+
blankLineBetween: boolean): void {
645+
const pos = sourceFile.end + 1;
646+
const options = {
647+
prefix: this.newLineCharacter,
648+
suffix: this.newLineCharacter + (blankLineBetween ? this.newLineCharacter : ""),
649+
};
650+
this.insertNodesAt(sourceFile, pos, insert, options);
651+
}
652+
634653
private insertStatementsInNewFile(fileName: string, statements: readonly (Statement | SyntaxKind.NewLineTrivia)[], oldFile?: SourceFile): void {
635654
if (!this.newFileChanges) {
636655
this.newFileChanges = createMultiMap<string, NewFileInsertion>();

Diff for: ‎src/services/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ export interface LanguageService {
652652
* arguments for any interactive action before offering it.
653653
*/
654654
getApplicableRefactors(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string, includeInteractiveActions?: boolean): ApplicableRefactorInfo[];
655-
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, includeInteractiveActions?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
655+
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, interactiveRefactorArguments?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
656656
getMoveToRefactoringFileSuggestions(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string): { newFileName: string, files: string[] };
657657
organizeImports(args: OrganizeImportsArgs, formatOptions: FormatCodeSettings, preferences: UserPreferences | undefined): readonly FileTextChanges[];
658658
getEditsForFileRename(oldFilePath: string, newFilePath: string, formatOptions: FormatCodeSettings, preferences: UserPreferences | undefined): readonly FileTextChanges[];

Diff for: ‎tests/baselines/reference/api/tsserverlibrary.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10191,7 +10191,7 @@ declare namespace ts {
1019110191
* arguments for any interactive action before offering it.
1019210192
*/
1019310193
getApplicableRefactors(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string, includeInteractiveActions?: boolean): ApplicableRefactorInfo[];
10194-
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, includeInteractiveActions?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
10194+
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, interactiveRefactorArguments?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
1019510195
getMoveToRefactoringFileSuggestions(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string): {
1019610196
newFileName: string;
1019710197
files: string[];

Diff for: ‎tests/baselines/reference/api/typescript.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6227,7 +6227,7 @@ declare namespace ts {
62276227
* arguments for any interactive action before offering it.
62286228
*/
62296229
getApplicableRefactors(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string, includeInteractiveActions?: boolean): ApplicableRefactorInfo[];
6230-
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, includeInteractiveActions?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
6230+
getEditsForRefactor(fileName: string, formatOptions: FormatCodeSettings, positionOrRange: number | TextRange, refactorName: string, actionName: string, preferences: UserPreferences | undefined, interactiveRefactorArguments?: InteractiveRefactorArguments): RefactorEditInfo | undefined;
62316231
getMoveToRefactoringFileSuggestions(fileName: string, positionOrRange: number | TextRange, preferences: UserPreferences | undefined, triggerReason?: RefactorTriggerReason, kind?: string): {
62326232
newFileName: string;
62336233
files: string[];

Diff for: ‎tests/cases/fourslash/moveToFile_blankExistingFile.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ verify.moveToFile({
1818
`,
1919

2020
"/bar.ts":
21-
`import { b } from './other';
21+
`//
2222
import { p } from './a';
2323
24+
25+
import { b } from "./other";
26+
27+
2428
const y: Date = p + b;
2529
`,
2630
},

Diff for: ‎tests/cases/fourslash/moveToFile_differentDirectories2.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ export const a = 10;
2323
y;`,
2424

2525
"/src/dir2/bar.ts":
26-
`import { b } from '../dir1/other';
27-
import { a } from '../dir1/a';
26+
`import { a } from '../dir1/a';
27+
28+
import { b } from "../dir1/other";
29+
2830
2931
export const y = b + a;
3032
`,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/// <reference path='../fourslash.ts' />
2+
3+
// @Filename: /source.ts
4+
////[|export const a = 1;|]
5+
////const b = 2;
6+
////console.log(a, b);
7+
8+
// @Filename: /target.ts
9+
/////** empty */
10+
11+
// @Filename: /tsconfig.json
12+
///// { "compilerOptions": { "newLine": "lf" } }
13+
14+
verify.moveToFile({
15+
newFileContents: {
16+
"/source.ts":
17+
`import { a } from "./target";
18+
19+
const b = 2;
20+
console.log(a, b);`,
21+
"/target.ts":
22+
`/** empty */
23+
export const a = 1;
24+
`,
25+
},
26+
interactiveRefactorArguments: { targetFile: "/target.ts" },
27+
});

0 commit comments

Comments
 (0)