aboutsummaryrefslogtreecommitdiff
path: root/crates/rust-analyzer
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-03-13 13:50:35 +0000
committerGitHub <[email protected]>2021-03-13 13:50:35 +0000
commit7accf6bc37c059a83a58c82f463f02a02ed2226f (patch)
tree979c8ebe39bde9c989cb1a09f06cea4cf7cb04ac /crates/rust-analyzer
parent9674490b45a931399a9a05cd3a4c7e8fae9ec2a8 (diff)
parent49cdb2452a225dec3834e69fb011c3d7e68084f7 (diff)
Merge #7799
7799: Related tests r=matklad a=vsrs ![tests](https://user-images.githubusercontent.com/62505555/109397453-a9013680-7947-11eb-8b11-ac03079f7645.gif) This adds an ability to look for tests for the item under the cursor: function, constant, data type, etc The LSP part is bound to change. But the feature itself already works and I'm looking for a feedback :) Co-authored-by: vsrs <[email protected]>
Diffstat (limited to 'crates/rust-analyzer')
-rw-r--r--crates/rust-analyzer/src/handlers.rs30
-rw-r--r--crates/rust-analyzer/src/lsp_ext.rs13
-rw-r--r--crates/rust-analyzer/src/main_loop.rs1
-rw-r--r--crates/rust-analyzer/src/to_proto.rs5
4 files changed, 39 insertions, 10 deletions
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
index 6cc433cb8..706a39dab 100644
--- a/crates/rust-analyzer/src/handlers.rs
+++ b/crates/rust-analyzer/src/handlers.rs
@@ -555,7 +555,7 @@ pub(crate) fn handle_runnables(
555 if should_skip_target(&runnable, cargo_spec.as_ref()) { 555 if should_skip_target(&runnable, cargo_spec.as_ref()) {
556 continue; 556 continue;
557 } 557 }
558 let mut runnable = to_proto::runnable(&snap, file_id, runnable)?; 558 let mut runnable = to_proto::runnable(&snap, runnable)?;
559 if expect_test { 559 if expect_test {
560 runnable.label = format!("{} + expect", runnable.label); 560 runnable.label = format!("{} + expect", runnable.label);
561 runnable.args.expect_test = Some(true); 561 runnable.args.expect_test = Some(true);
@@ -607,6 +607,24 @@ pub(crate) fn handle_runnables(
607 Ok(res) 607 Ok(res)
608} 608}
609 609
610pub(crate) fn handle_related_tests(
611 snap: GlobalStateSnapshot,
612 params: lsp_types::TextDocumentPositionParams,
613) -> Result<Vec<lsp_ext::TestInfo>> {
614 let _p = profile::span("handle_related_tests");
615 let position = from_proto::file_position(&snap, params)?;
616
617 let tests = snap.analysis.related_tests(position, None)?;
618 let mut res = Vec::new();
619 for it in tests {
620 if let Ok(runnable) = to_proto::runnable(&snap, it) {
621 res.push(lsp_ext::TestInfo { runnable })
622 }
623 }
624
625 Ok(res)
626}
627
610pub(crate) fn handle_completion( 628pub(crate) fn handle_completion(
611 snap: GlobalStateSnapshot, 629 snap: GlobalStateSnapshot,
612 params: lsp_types::CompletionParams, 630 params: lsp_types::CompletionParams,
@@ -772,7 +790,7 @@ pub(crate) fn handle_hover(
772 contents: HoverContents::Markup(to_proto::markup_content(info.info.markup)), 790 contents: HoverContents::Markup(to_proto::markup_content(info.info.markup)),
773 range: Some(range), 791 range: Some(range),
774 }, 792 },
775 actions: prepare_hover_actions(&snap, position.file_id, &info.info.actions), 793 actions: prepare_hover_actions(&snap, &info.info.actions),
776 }; 794 };
777 795
778 Ok(Some(hover)) 796 Ok(Some(hover))
@@ -1440,17 +1458,16 @@ fn show_impl_command_link(
1440 1458
1441fn runnable_action_links( 1459fn runnable_action_links(
1442 snap: &GlobalStateSnapshot, 1460 snap: &GlobalStateSnapshot,
1443 file_id: FileId,
1444 runnable: Runnable, 1461 runnable: Runnable,
1445) -> Option<lsp_ext::CommandLinkGroup> { 1462) -> Option<lsp_ext::CommandLinkGroup> {
1446 let cargo_spec = CargoTargetSpec::for_file(&snap, file_id).ok()?; 1463 let cargo_spec = CargoTargetSpec::for_file(&snap, runnable.nav.file_id).ok()?;
1447 let hover_config = snap.config.hover(); 1464 let hover_config = snap.config.hover();
1448 if !hover_config.runnable() || should_skip_target(&runnable, cargo_spec.as_ref()) { 1465 if !hover_config.runnable() || should_skip_target(&runnable, cargo_spec.as_ref()) {
1449 return None; 1466 return None;
1450 } 1467 }
1451 1468
1452 let action: &'static _ = runnable.action(); 1469 let action: &'static _ = runnable.action();
1453 to_proto::runnable(snap, file_id, runnable).ok().map(|r| { 1470 to_proto::runnable(snap, runnable).ok().map(|r| {
1454 let mut group = lsp_ext::CommandLinkGroup::default(); 1471 let mut group = lsp_ext::CommandLinkGroup::default();
1455 1472
1456 if hover_config.run { 1473 if hover_config.run {
@@ -1489,7 +1506,6 @@ fn goto_type_action_links(
1489 1506
1490fn prepare_hover_actions( 1507fn prepare_hover_actions(
1491 snap: &GlobalStateSnapshot, 1508 snap: &GlobalStateSnapshot,
1492 file_id: FileId,
1493 actions: &[HoverAction], 1509 actions: &[HoverAction],
1494) -> Vec<lsp_ext::CommandLinkGroup> { 1510) -> Vec<lsp_ext::CommandLinkGroup> {
1495 if snap.config.hover().none() || !snap.config.hover_actions() { 1511 if snap.config.hover().none() || !snap.config.hover_actions() {
@@ -1500,7 +1516,7 @@ fn prepare_hover_actions(
1500 .iter() 1516 .iter()
1501 .filter_map(|it| match it { 1517 .filter_map(|it| match it {
1502 HoverAction::Implementation(position) => show_impl_command_link(snap, position), 1518 HoverAction::Implementation(position) => show_impl_command_link(snap, position),
1503 HoverAction::Runnable(r) => runnable_action_links(snap, file_id, r.clone()), 1519 HoverAction::Runnable(r) => runnable_action_links(snap, r.clone()),
1504 HoverAction::GoToType(targets) => goto_type_action_links(snap, targets), 1520 HoverAction::GoToType(targets) => goto_type_action_links(snap, targets),
1505 }) 1521 })
1506 .collect() 1522 .collect()
diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs
index 0d2c8f7ff..efcdcd1d9 100644
--- a/crates/rust-analyzer/src/lsp_ext.rs
+++ b/crates/rust-analyzer/src/lsp_ext.rs
@@ -177,6 +177,19 @@ pub struct CargoRunnable {
177 pub expect_test: Option<bool>, 177 pub expect_test: Option<bool>,
178} 178}
179 179
180pub enum RelatedTests {}
181
182impl Request for RelatedTests {
183 type Params = lsp_types::TextDocumentPositionParams;
184 type Result = Vec<TestInfo>;
185 const METHOD: &'static str = "rust-analyzer/relatedTests";
186}
187
188#[derive(Debug, Deserialize, Serialize)]
189pub struct TestInfo {
190 pub runnable: Runnable,
191}
192
180pub enum InlayHints {} 193pub enum InlayHints {}
181 194
182impl Request for InlayHints { 195impl Request for InlayHints {
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index f0cb309e4..984790d35 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -500,6 +500,7 @@ impl GlobalState {
500 .on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro) 500 .on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
501 .on::<lsp_ext::ParentModule>(handlers::handle_parent_module) 501 .on::<lsp_ext::ParentModule>(handlers::handle_parent_module)
502 .on::<lsp_ext::Runnables>(handlers::handle_runnables) 502 .on::<lsp_ext::Runnables>(handlers::handle_runnables)
503 .on::<lsp_ext::RelatedTests>(handlers::handle_related_tests)
503 .on::<lsp_ext::InlayHints>(handlers::handle_inlay_hints) 504 .on::<lsp_ext::InlayHints>(handlers::handle_inlay_hints)
504 .on::<lsp_ext::CodeActionRequest>(handlers::handle_code_action) 505 .on::<lsp_ext::CodeActionRequest>(handlers::handle_code_action)
505 .on::<lsp_ext::CodeActionResolveRequest>(handlers::handle_code_action_resolve) 506 .on::<lsp_ext::CodeActionResolveRequest>(handlers::handle_code_action_resolve)
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index 1a8cdadad..9ca0915b9 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -838,11 +838,10 @@ pub(crate) fn resolved_code_action(
838 838
839pub(crate) fn runnable( 839pub(crate) fn runnable(
840 snap: &GlobalStateSnapshot, 840 snap: &GlobalStateSnapshot,
841 file_id: FileId,
842 runnable: Runnable, 841 runnable: Runnable,
843) -> Result<lsp_ext::Runnable> { 842) -> Result<lsp_ext::Runnable> {
844 let config = snap.config.runnables(); 843 let config = snap.config.runnables();
845 let spec = CargoTargetSpec::for_file(snap, file_id)?; 844 let spec = CargoTargetSpec::for_file(snap, runnable.nav.file_id)?;
846 let workspace_root = spec.as_ref().map(|it| it.workspace_root.clone()); 845 let workspace_root = spec.as_ref().map(|it| it.workspace_root.clone());
847 let target = spec.as_ref().map(|s| s.target.clone()); 846 let target = spec.as_ref().map(|s| s.target.clone());
848 let (cargo_args, executable_args) = 847 let (cargo_args, executable_args) =
@@ -875,7 +874,7 @@ pub(crate) fn code_lens(
875 let annotation_range = range(&line_index, annotation.range); 874 let annotation_range = range(&line_index, annotation.range);
876 875
877 let action = run.action(); 876 let action = run.action();
878 let r = runnable(&snap, run.nav.file_id, run)?; 877 let r = runnable(&snap, run)?;
879 878
880 let command = if debug { 879 let command = if debug {
881 command::debug_single(&r) 880 command::debug_single(&r)