mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-22 01:52:56 +00:00
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.
This commit is contained in:
parent
ada5a88f8f
commit
7d2eb000b0
15 changed files with 86 additions and 91 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue