Skip to content

Commit 5ca6318

Browse files
committed
feat: implemented provideRenameEdits
1 parent 6b05d17 commit 5ca6318

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/monaco/code2monaco.ts

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export function asTextEdit(edit: vscode.TextEdit): monaco.languages.TextEdit {
9999
}
100100

101101
export function asCompletionItemRange(textEdit: vscode.CompletionItem['textEdit']): monaco.languages.CompletionItem['range'] {
102-
if (textEdit && 'insert' in textEdit && 'replace' in textEdit) {
102+
if (textEdit && vscode.InsertReplaceEdit.is(textEdit)) {
103103
const result: monaco.languages.CompletionItemRanges = {
104104
insert: asRange(textEdit.insert),
105105
replace: asRange(textEdit.replace),
@@ -142,7 +142,7 @@ export function asMarkdownString(markdownString: vscode.Hover['contents']): mona
142142
}
143143

144144
export function asLocation(definition: vscode.LocationLink | vscode.Location): monaco.languages.Location {
145-
if ('targetUri' in definition) {
145+
if (vscode.LocationLink.is(definition)) {
146146
return {
147147
uri: asUri(definition.targetUri),
148148
range: asRange(definition.targetRange),
@@ -227,3 +227,61 @@ export function asMarkerSeverity(severity: vscode.DiagnosticSeverity | undefined
227227
return monaco.MarkerSeverity.Info;
228228
}
229229
}
230+
231+
export function asWorkspaceEdit(workspaceEdit: vscode.WorkspaceEdit): monaco.languages.WorkspaceEdit {
232+
const result: monaco.languages.WorkspaceEdit = {
233+
edits: [],
234+
};
235+
if (workspaceEdit.changes) {
236+
for (const uri in workspaceEdit.changes) {
237+
const edits = workspaceEdit.changes[uri];
238+
for (const edit of edits) {
239+
result.edits.push({
240+
resource: asUri(uri),
241+
edit: asTextEdit(edit),
242+
});
243+
}
244+
}
245+
}
246+
if (workspaceEdit.documentChanges) {
247+
for (const documentChange of workspaceEdit.documentChanges) {
248+
if (vscode.TextDocumentEdit.is(documentChange)) {
249+
for (const edit of documentChange.edits) {
250+
result.edits.push({
251+
resource: asUri(documentChange.textDocument.uri),
252+
edit: asTextEdit(edit),
253+
});
254+
}
255+
}
256+
else if (vscode.CreateFile.is(documentChange)) {
257+
result.edits.push({
258+
newUri: asUri(documentChange.uri),
259+
options: {
260+
overwrite: documentChange.options?.overwrite ?? false,
261+
ignoreIfExists: documentChange.options?.ignoreIfExists ?? false,
262+
},
263+
});
264+
}
265+
else if (vscode.RenameFile.is(documentChange)) {
266+
result.edits.push({
267+
oldUri: asUri(documentChange.oldUri),
268+
newUri: asUri(documentChange.newUri),
269+
options: {
270+
overwrite: documentChange.options?.overwrite ?? false,
271+
ignoreIfExists: documentChange.options?.ignoreIfExists ?? false,
272+
},
273+
});
274+
}
275+
else if (vscode.DeleteFile.is(documentChange)) {
276+
result.edits.push({
277+
oldUri: asUri(documentChange.uri),
278+
options: {
279+
recursive: documentChange.options?.recursive ?? false,
280+
ignoreIfNotExists: documentChange.options?.ignoreIfNotExists ?? false,
281+
},
282+
});
283+
}
284+
}
285+
}
286+
return result;
287+
}

src/monaco/ls.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,18 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
210210
}
211211
},
212212
}),
213+
monaco.languages.registerRenameProvider(lang, {
214+
provideRenameEdits: async (model, position, newName) => {
215+
const codeResult = await ls.doRename(
216+
model.uri.toString(),
217+
monaco2code.asPosition(position),
218+
newName,
219+
);
220+
if (codeResult) {
221+
return code2monaco.asWorkspaceEdit(codeResult);
222+
}
223+
},
224+
}),
213225
monaco.languages.registerCompletionItemProvider(lang, {
214226
// https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57
215227
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''),

0 commit comments

Comments
 (0)