From dcfc9ccace1e6c8cb7e7c07f10ccb7ef261e943a Mon Sep 17 00:00:00 2001 From: hkalbasi Date: Fri, 15 Mar 2024 17:13:44 +0330 Subject: [PATCH] Distinguish integration tests from crates in test explorer --- crates/ide/src/test_explorer.rs | 25 +++++++++++++----------- crates/rust-analyzer/src/lsp/to_proto.rs | 19 ++++++++++++++++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/crates/ide/src/test_explorer.rs b/crates/ide/src/test_explorer.rs index 2e741021ea8..ca471399703 100644 --- a/crates/ide/src/test_explorer.rs +++ b/crates/ide/src/test_explorer.rs @@ -11,7 +11,7 @@ #[derive(Debug)] pub enum TestItemKind { - Crate, + Crate(CrateId), Module, Function, } @@ -32,15 +32,17 @@ pub(crate) fn discover_test_roots(db: &RootDatabase) -> Vec { 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 0423b2f4da3..e77d0c13bf2 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