diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-13 13:50:35 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-13 13:50:35 +0000 |
commit | 7accf6bc37c059a83a58c82f463f02a02ed2226f (patch) | |
tree | 979c8ebe39bde9c989cb1a09f06cea4cf7cb04ac /crates/rust-analyzer | |
parent | 9674490b45a931399a9a05cd3a4c7e8fae9ec2a8 (diff) | |
parent | 49cdb2452a225dec3834e69fb011c3d7e68084f7 (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.rs | 30 | ||||
-rw-r--r-- | crates/rust-analyzer/src/lsp_ext.rs | 13 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 1 | ||||
-rw-r--r-- | crates/rust-analyzer/src/to_proto.rs | 5 |
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 | ||
610 | pub(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 | |||
610 | pub(crate) fn handle_completion( | 628 | pub(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 | ||
1441 | fn runnable_action_links( | 1459 | fn 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 | ||
1490 | fn prepare_hover_actions( | 1507 | fn 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 | ||
180 | pub enum RelatedTests {} | ||
181 | |||
182 | impl 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)] | ||
189 | pub struct TestInfo { | ||
190 | pub runnable: Runnable, | ||
191 | } | ||
192 | |||
180 | pub enum InlayHints {} | 193 | pub enum InlayHints {} |
181 | 194 | ||
182 | impl Request for InlayHints { | 195 | impl 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 | ||
839 | pub(crate) fn runnable( | 839 | pub(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) |