diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2020-11-10 18:20:01 +0100 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2020-11-10 18:48:46 +0100 |
| commit | 7d2eb000b078143e9fa6225d00ef52fc7c606fdf (patch) | |
| tree | 580d90bd250ffcd4b1c66570e5601761e58d1057 /editors/code/src/client.ts | |
| parent | ada5a88f8fd0a79af7ad6e0411acc1cce9ef32d5 (diff) | |
| download | rust-7d2eb000b078143e9fa6225d00ef52fc7c606fdf.tar.gz rust-7d2eb000b078143e9fa6225d00ef52fc7c606fdf.zip | |
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.
Diffstat (limited to 'editors/code/src/client.ts')
| -rw-r--r-- | editors/code/src/client.ts | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index d032b45b71a..c9d032ead38 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; |
