Skip to content

Commit f15a838

Browse files
committed
Add support for file renames
1 parent a328945 commit f15a838

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

server/src/server.ts

+25-7
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import * as utils from "./utils";
1515
import * as c from "./constants";
1616
import * as chokidar from "chokidar";
1717
import { assert } from "console";
18-
import { fileURLToPath } from "url";
18+
import { fileURLToPath, pathToFileURL } from "url";
1919
import { ChildProcess } from "child_process";
2020
import { WorkspaceEdit } from "vscode-languageserver";
2121
import { TextEdit } from "vscode-languageserver-types";
@@ -294,16 +294,34 @@ function rename(msg: p.RequestMessage) {
294294
if (locations === null) {
295295
result = null;
296296
} else {
297-
let changes: { [uri: string]: TextEdit[] } = {};
297+
let textEdits: { [uri: string]: TextEdit[] } = {};
298+
let documentChanges: (p.RenameFile | p.TextDocumentEdit)[] = [];
299+
298300
locations.forEach(({ uri, range }) => {
299-
let textEdit: TextEdit = { range, newText: params.newName };
300-
if (uri in changes) {
301-
changes[uri].push(textEdit);
301+
if (utils.isRangeTopOfFile(range)) {
302+
let filePath = fileURLToPath(uri);
303+
let newFilePath = `${path.dirname(filePath)}/${params.newName}${path.extname(filePath)}`;
304+
let newUri = pathToFileURL(newFilePath).href;
305+
let rename: p.RenameFile = { kind: "rename", oldUri: uri, newUri };
306+
documentChanges.push(rename);
302307
} else {
303-
changes[uri] = [textEdit];
308+
let textEdit: TextEdit = { range, newText: params.newName };
309+
if (uri in textEdits) {
310+
textEdits[uri].push(textEdit);
311+
} else {
312+
textEdits[uri] = [textEdit];
313+
}
304314
}
305315
});
306-
result = { changes };
316+
317+
Object.entries(textEdits)
318+
.forEach(([uri, edits]) => {
319+
let textDocumentEdit = { textDocument: { uri, version: null }, edits };
320+
documentChanges.push(textDocumentEdit);
321+
});
322+
323+
324+
result = { documentChanges };
307325
}
308326
let response: m.ResponseMessage = {
309327
jsonrpc: c.jsonrpcVersion,

server/src/utils.ts

+8
Original file line numberDiff line numberDiff line change
@@ -476,3 +476,11 @@ export let parseCompilerLogOutput = (
476476

477477
return { done, result };
478478
};
479+
480+
export let isRangeTopOfFile = (range: p.Range) =>
481+
[
482+
range.start.character,
483+
range.start.line,
484+
range.end.character,
485+
range.end.line
486+
].every(n => n === 0);

0 commit comments

Comments
 (0)