From 5ca63181a2beebcc180282cd70f6732e572fd51d Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 9 Jun 2022 18:10:40 +0800 Subject: [PATCH] feat: implemented provideRenameEdits --- src/monaco/code2monaco.ts | 62 +++++++++++++++++++++++++++++++++++++-- src/monaco/ls.ts | 12 ++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/monaco/code2monaco.ts b/src/monaco/code2monaco.ts index 9fe96f7f..3e3cae9c 100644 --- a/src/monaco/code2monaco.ts +++ b/src/monaco/code2monaco.ts @@ -99,7 +99,7 @@ export function asTextEdit(edit: vscode.TextEdit): monaco.languages.TextEdit { } export function asCompletionItemRange(textEdit: vscode.CompletionItem['textEdit']): monaco.languages.CompletionItem['range'] { - if (textEdit && 'insert' in textEdit && 'replace' in textEdit) { + if (textEdit && vscode.InsertReplaceEdit.is(textEdit)) { const result: monaco.languages.CompletionItemRanges = { insert: asRange(textEdit.insert), replace: asRange(textEdit.replace), @@ -142,7 +142,7 @@ export function asMarkdownString(markdownString: vscode.Hover['contents']): mona } export function asLocation(definition: vscode.LocationLink | vscode.Location): monaco.languages.Location { - if ('targetUri' in definition) { + if (vscode.LocationLink.is(definition)) { return { uri: asUri(definition.targetUri), range: asRange(definition.targetRange), @@ -227,3 +227,61 @@ export function asMarkerSeverity(severity: vscode.DiagnosticSeverity | undefined return monaco.MarkerSeverity.Info; } } + +export function asWorkspaceEdit(workspaceEdit: vscode.WorkspaceEdit): monaco.languages.WorkspaceEdit { + const result: monaco.languages.WorkspaceEdit = { + edits: [], + }; + if (workspaceEdit.changes) { + for (const uri in workspaceEdit.changes) { + const edits = workspaceEdit.changes[uri]; + for (const edit of edits) { + result.edits.push({ + resource: asUri(uri), + edit: asTextEdit(edit), + }); + } + } + } + if (workspaceEdit.documentChanges) { + for (const documentChange of workspaceEdit.documentChanges) { + if (vscode.TextDocumentEdit.is(documentChange)) { + for (const edit of documentChange.edits) { + result.edits.push({ + resource: asUri(documentChange.textDocument.uri), + edit: asTextEdit(edit), + }); + } + } + else if (vscode.CreateFile.is(documentChange)) { + result.edits.push({ + newUri: asUri(documentChange.uri), + options: { + overwrite: documentChange.options?.overwrite ?? false, + ignoreIfExists: documentChange.options?.ignoreIfExists ?? false, + }, + }); + } + else if (vscode.RenameFile.is(documentChange)) { + result.edits.push({ + oldUri: asUri(documentChange.oldUri), + newUri: asUri(documentChange.newUri), + options: { + overwrite: documentChange.options?.overwrite ?? false, + ignoreIfExists: documentChange.options?.ignoreIfExists ?? false, + }, + }); + } + else if (vscode.DeleteFile.is(documentChange)) { + result.edits.push({ + oldUri: asUri(documentChange.uri), + options: { + recursive: documentChange.options?.recursive ?? false, + ignoreIfNotExists: documentChange.options?.ignoreIfNotExists ?? false, + }, + }); + } + } + } + return result; +} diff --git a/src/monaco/ls.ts b/src/monaco/ls.ts index 5cdf8a33..30959d29 100644 --- a/src/monaco/ls.ts +++ b/src/monaco/ls.ts @@ -210,6 +210,18 @@ export async function setupLs(modelsMap: Ref { + const codeResult = await ls.doRename( + model.uri.toString(), + monaco2code.asPosition(position), + newName, + ); + if (codeResult) { + return code2monaco.asWorkspaceEdit(codeResult); + } + }, + }), monaco.languages.registerCompletionItemProvider(lang, { // https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57 triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''),