From 7d2eb000b078143e9fa6225d00ef52fc7c606fdf Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 10 Nov 2020 18:20:01 +0100 Subject: Switch to upstream protocol for resolving code action Note that we have to maintain custom implementation on the client side: I don't see how to marry bulitin resolve support with groups and snippets. --- editors/code/src/client.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'editors/code/src/client.ts') diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index d032b45b7..c9d032ead 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts @@ -4,6 +4,7 @@ import * as ra from '../src/lsp_ext'; import * as Is from 'vscode-languageclient/lib/common/utils/is'; import { DocumentSemanticsTokensSignature, DocumentSemanticsTokensEditsSignature, DocumentRangeSemanticTokensSignature } from 'vscode-languageclient/lib/common/semanticTokens'; import { assert } from './util'; +import { WorkspaceEdit } from 'vscode'; function renderCommand(cmd: ra.CommandLink) { return `[${cmd.title}](command:${cmd.command}?${encodeURIComponent(JSON.stringify(cmd.arguments))} '${cmd.tooltip!}')`; @@ -75,8 +76,8 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient return Promise.resolve(null); }); }, - // Using custom handling of CodeActions where each code action is resolved lazily - // That's why we are not waiting for any command or edits + // Using custom handling of CodeActions to support action groups and snippet edits. + // Note that this means we have to re-implement lazy edit resolving ourselves as well. async provideCodeActions(document: vscode.TextDocument, range: vscode.Range, context: vscode.CodeActionContext, token: vscode.CancellationToken, _next: lc.ProvideCodeActionsSignature) { const params: lc.CodeActionParams = { textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), @@ -99,16 +100,15 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient const kind = client.protocol2CodeConverter.asCodeActionKind((item as any).kind); const action = new vscode.CodeAction(item.title, kind); const group = (item as any).group; - const id = (item as any).id; - const resolveParams: ra.ResolveCodeActionParams = { - id: id, - codeActionParams: params - }; action.command = { command: "rust-analyzer.resolveCodeAction", title: item.title, - arguments: [resolveParams], + arguments: [item], }; + + // Set a dummy edit, so that VS Code doesn't try to resolve this. + action.edit = new WorkspaceEdit(); + if (group) { let entry = groups.get(group); if (!entry) { @@ -134,6 +134,10 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient return { label: item.title, arguments: item.command!!.arguments!![0] }; })], }; + + // Set a dummy edit, so that VS Code doesn't try to resolve this. + action.edit = new WorkspaceEdit(); + result[index] = action; } } @@ -164,7 +168,6 @@ class ExperimentalFeatures implements lc.StaticFeature { const caps: any = capabilities.experimental ?? {}; caps.snippetTextEdit = true; caps.codeActionGroup = true; - caps.resolveCodeAction = true; caps.hoverActions = true; caps.statusNotification = true; capabilities.experimental = caps; -- cgit v1.2.3