Add LSP request and VSCode command

This commit is contained in:
vsrs 2021-02-27 20:04:43 +03:00
parent 31f5f816e3
commit 669e117644
7 changed files with 96 additions and 9 deletions

View file

@ -607,6 +607,24 @@ pub(crate) fn handle_runnables(
Ok(res)
}
pub(crate) fn handle_related_tests(
snap: GlobalStateSnapshot,
params: lsp_ext::RelatedTestsParams,
) -> Result<Vec<lsp_ext::TestInfo>> {
let _p = profile::span("handle_related_tests");
let position = from_proto::file_position(&snap, params.text_document_position)?;
let tests = snap.analysis.related_tests(position, None)?;
let mut res = Vec::new();
for it in tests {
if let Ok(runnable) = to_proto::runnable(&snap, it) {
res.push(lsp_ext::TestInfo { runnable })
}
}
Ok(res)
}
pub(crate) fn handle_completion(
snap: GlobalStateSnapshot,
params: lsp_types::CompletionParams,

View file

@ -177,6 +177,26 @@ pub struct CargoRunnable {
pub expect_test: Option<bool>,
}
pub enum RelatedTests {}
impl Request for RelatedTests {
type Params = RelatedTestsParams;
type Result = Vec<TestInfo>;
const METHOD: &'static str = "rust-analyzer/relatedTests";
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RelatedTestsParams {
#[serde(flatten)]
pub text_document_position: lsp_types::TextDocumentPositionParams,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct TestInfo {
pub runnable: Runnable,
}
pub enum InlayHints {}
impl Request for InlayHints {

View file

@ -500,6 +500,7 @@ impl GlobalState {
.on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
.on::<lsp_ext::ParentModule>(handlers::handle_parent_module)
.on::<lsp_ext::Runnables>(handlers::handle_runnables)
.on::<lsp_ext::RelatedTests>(handlers::handle_related_tests)
.on::<lsp_ext::InlayHints>(handlers::handle_inlay_hints)
.on::<lsp_ext::CodeActionRequest>(handlers::handle_code_action)
.on::<lsp_ext::CodeActionResolveRequest>(handlers::handle_code_action_resolve)

View file

@ -202,6 +202,11 @@
"command": "rust-analyzer.openCargoToml",
"title": "Open Cargo.toml",
"category": "Rust Analyzer"
},
{
"command": "rust-analyzer.peekTests",
"title": "Peek related tests",
"category": "Rust Analyzer"
}
],
"keybindings": [

View file

@ -9,6 +9,7 @@ import { RunnableQuickPick, selectRunnable, createTask, createArgs } from './run
import { AstInspector } from './ast_inspector';
import { isRustDocument, sleep, isRustEditor } from './util';
import { startDebugSession, makeDebugConfig } from './debug';
import { LanguageClient } from 'vscode-languageclient/node';
export * from './ast_inspector';
export * from './run';
@ -456,17 +457,20 @@ export function reloadWorkspace(ctx: Ctx): Cmd {
return async () => ctx.client.sendRequest(ra.reloadWorkspace);
}
async function showReferencesImpl(client: LanguageClient, uri: string, position: lc.Position, locations: lc.Location[]) {
if (client) {
await vscode.commands.executeCommand(
'editor.action.showReferences',
vscode.Uri.parse(uri),
client.protocol2CodeConverter.asPosition(position),
locations.map(client.protocol2CodeConverter.asLocation),
);
}
}
export function showReferences(ctx: Ctx): Cmd {
return async (uri: string, position: lc.Position, locations: lc.Location[]) => {
const client = ctx.client;
if (client) {
await vscode.commands.executeCommand(
'editor.action.showReferences',
vscode.Uri.parse(uri),
client.protocol2CodeConverter.asPosition(position),
locations.map(client.protocol2CodeConverter.asLocation),
);
}
await showReferencesImpl(ctx.client, uri, position, locations);
};
}
@ -555,6 +559,35 @@ export function run(ctx: Ctx): Cmd {
};
}
export function peekTests(ctx: Ctx): Cmd {
const client = ctx.client;
return async () => {
const editor = ctx.activeRustEditor;
if (!editor || !client) return;
const uri = editor.document.uri.toString();
const position = client.code2ProtocolConverter.asPosition(
editor.selection.active,
);
const tests = await client.sendRequest(ra.relatedTests, {
textDocument: { uri: uri },
position: position,
});
const locations: lc.Location[] = tests.map( it => {
return {
uri: it.runnable.location!.targetUri,
range: it.runnable.location!.targetSelectionRange
};
});
await showReferencesImpl(client, uri, position, locations);
};
}
export function runSingle(ctx: Ctx): Cmd {
return async (runnable: ra.Runnable) => {
const editor = ctx.activeRustEditor;

View file

@ -72,6 +72,15 @@ export interface Runnable {
}
export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables");
export interface RelatedTestsParams extends lc.TextDocumentPositionParams {
}
export interface TestInfo {
runnable: Runnable;
}
export const relatedTests = new lc.RequestType<RelatedTestsParams, TestInfo[], void>("rust-analyzer/relatedTests");
export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint;
export namespace InlayHint {

View file

@ -113,6 +113,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
ctx.registerCommand('newDebugConfig', commands.newDebugConfig);
ctx.registerCommand('openDocs', commands.openDocs);
ctx.registerCommand('openCargoToml', commands.openCargoToml);
ctx.registerCommand('peekTests', commands.peekTests);
defaultOnEnter.dispose();
ctx.registerCommand('onEnter', commands.onEnter);