Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide/src/test_explorer.rs25
-rw-r--r--crates/rust-analyzer/src/lsp/to_proto.rs19
2 files changed, 31 insertions, 13 deletions
diff --git a/crates/ide/src/test_explorer.rs b/crates/ide/src/test_explorer.rs
index 2e741021ea..ca47139970 100644
--- a/crates/ide/src/test_explorer.rs
+++ b/crates/ide/src/test_explorer.rs
@@ -11,7 +11,7 @@ use crate::{navigation_target::ToNav, runnables::runnable_fn, Runnable, TryToNav
#[derive(Debug)]
pub enum TestItemKind {
- Crate,
+ Crate(CrateId),
Module,
Function,
}
@@ -32,15 +32,17 @@ pub(crate) fn discover_test_roots(db: &RootDatabase) -> Vec<TestItem> {
crate_graph
.iter()
.filter(|&id| crate_graph[id].origin.is_local())
- .filter_map(|id| Some(crate_graph[id].display_name.as_ref()?.to_string()))
- .map(|id| TestItem {
- kind: TestItemKind::Crate,
- label: id.clone(),
- id,
- parent: None,
- file: None,
- text_range: None,
- runnable: None,
+ .filter_map(|id| {
+ let test_id = crate_graph[id].display_name.as_ref()?.to_string();
+ Some(TestItem {
+ kind: TestItemKind::Crate(id),
+ label: test_id.clone(),
+ id: test_id,
+ parent: None,
+ file: None,
+ text_range: None,
+ runnable: None,
+ })
})
.collect()
}
@@ -118,12 +120,13 @@ pub(crate) fn discover_tests_in_crate(db: &RootDatabase, crate_id: CrateId) -> V
let Some(crate_test_id) = &crate_graph[crate_id].display_name else {
return vec![];
};
+ let kind = TestItemKind::Crate(crate_id);
let crate_test_id = crate_test_id.to_string();
let crate_id: Crate = crate_id.into();
let module = crate_id.root_module();
let mut r = vec![TestItem {
id: crate_test_id.clone(),
- kind: TestItemKind::Crate,
+ kind,
label: crate_test_id.clone(),
parent: None,
file: None,
diff --git a/crates/rust-analyzer/src/lsp/to_proto.rs b/crates/rust-analyzer/src/lsp/to_proto.rs
index 0423b2f4da..e77d0c13bf 100644
--- a/crates/rust-analyzer/src/lsp/to_proto.rs
+++ b/crates/rust-analyzer/src/lsp/to_proto.rs
@@ -1519,13 +1519,28 @@ pub(crate) fn test_item(
id: test_item.id,
label: test_item.label,
kind: match test_item.kind {
- ide::TestItemKind::Crate => lsp_ext::TestItemKind::Package,
+ ide::TestItemKind::Crate(id) => 'b: {
+ let Some((cargo_ws, target)) = snap.cargo_target_for_crate_root(id) else {
+ break 'b lsp_ext::TestItemKind::Package;
+ };
+ let target = &cargo_ws[target];
+ match target.kind {
+ project_model::TargetKind::Bin
+ | project_model::TargetKind::Lib { .. }
+ | project_model::TargetKind::Example
+ | project_model::TargetKind::BuildScript
+ | project_model::TargetKind::Other => lsp_ext::TestItemKind::Package,
+ project_model::TargetKind::Test | project_model::TargetKind::Bench => {
+ lsp_ext::TestItemKind::Test
+ }
+ }
+ }
ide::TestItemKind::Module => lsp_ext::TestItemKind::Module,
ide::TestItemKind::Function => lsp_ext::TestItemKind::Test,
},
can_resolve_children: matches!(
test_item.kind,
- ide::TestItemKind::Crate | ide::TestItemKind::Module
+ ide::TestItemKind::Crate(_) | ide::TestItemKind::Module
),
parent: test_item.parent,
text_document: test_item