Skip to content

Commit 1c5c95e

Browse files
committed
refactor: Split out a target_spec_for_crate helper
1 parent fd47887 commit 1c5c95e

File tree

3 files changed

+36
-40
lines changed

3 files changed

+36
-40
lines changed

crates/rust-analyzer/src/global_state.rs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use parking_lot::{
1818
RwLockWriteGuard,
1919
};
2020
use proc_macro_api::ProcMacroServer;
21-
use project_model::{CargoWorkspace, ProjectWorkspace, Target, WorkspaceBuildScripts};
21+
use project_model::{ProjectWorkspace, WorkspaceBuildScripts};
2222
use rustc_hash::{FxHashMap, FxHashSet};
2323
use triomphe::Arc;
2424
use vfs::{AnchoredPathBuf, ChangedFile, Vfs};
@@ -33,6 +33,7 @@ use crate::{
3333
mem_docs::MemDocs,
3434
op_queue::OpQueue,
3535
reload,
36+
target_spec::{CargoTargetSpec, TargetSpec},
3637
task_pool::{TaskPool, TaskQueue},
3738
};
3839

@@ -500,20 +501,38 @@ impl GlobalStateSnapshot {
500501
self.vfs_read().file_path(file_id).clone()
501502
}
502503

503-
pub(crate) fn cargo_target_for_crate_root(
504-
&self,
505-
crate_id: CrateId,
506-
) -> Option<(&CargoWorkspace, Target)> {
504+
pub(crate) fn target_spec_for_crate(&self, crate_id: CrateId) -> Option<TargetSpec> {
507505
let file_id = self.analysis.crate_root(crate_id).ok()?;
508506
let path = self.vfs_read().file_path(file_id).clone();
509507
let path = path.as_path()?;
510-
self.workspaces.iter().find_map(|ws| match ws {
511-
ProjectWorkspace::Cargo { cargo, .. } => {
512-
cargo.target_by_root(path).map(|it| (cargo, it))
508+
509+
for workspace in self.workspaces.iter() {
510+
match workspace {
511+
ProjectWorkspace::Cargo { cargo, .. } => {
512+
let Some(target_idx) = cargo.target_by_root(path) else {
513+
continue;
514+
};
515+
516+
let target_data = &cargo[target_idx];
517+
let package_data = &cargo[target_data.package];
518+
519+
return Some(TargetSpec::Cargo(CargoTargetSpec {
520+
workspace_root: cargo.workspace_root().to_path_buf(),
521+
cargo_toml: package_data.manifest.clone(),
522+
crate_id,
523+
package: cargo.package_flag(package_data),
524+
target: target_data.name.clone(),
525+
target_kind: target_data.kind,
526+
required_features: target_data.required_features.clone(),
527+
features: package_data.features.keys().cloned().collect(),
528+
}));
529+
}
530+
ProjectWorkspace::Json { .. } => {}
531+
ProjectWorkspace::DetachedFiles { .. } => {}
513532
}
514-
ProjectWorkspace::Json { .. } => None,
515-
ProjectWorkspace::DetachedFiles { .. } => None,
516-
})
533+
}
534+
535+
None
517536
}
518537

519538
pub(crate) fn file_exists(&self, file_id: FileId) -> bool {

crates/rust-analyzer/src/lsp/to_proto.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,12 +1546,8 @@ pub(crate) fn test_item(
15461546
id: test_item.id,
15471547
label: test_item.label,
15481548
kind: match test_item.kind {
1549-
ide::TestItemKind::Crate(id) => 'b: {
1550-
let Some((cargo_ws, target)) = snap.cargo_target_for_crate_root(id) else {
1551-
break 'b lsp_ext::TestItemKind::Package;
1552-
};
1553-
let target = &cargo_ws[target];
1554-
match target.kind {
1549+
ide::TestItemKind::Crate(id) => match snap.target_spec_for_crate(id) {
1550+
Some(target_spec) => match target_spec.target_kind() {
15551551
project_model::TargetKind::Bin
15561552
| project_model::TargetKind::Lib { .. }
15571553
| project_model::TargetKind::Example
@@ -1560,8 +1556,9 @@ pub(crate) fn test_item(
15601556
project_model::TargetKind::Test | project_model::TargetKind::Bench => {
15611557
lsp_ext::TestItemKind::Test
15621558
}
1563-
}
1564-
}
1559+
},
1560+
None => lsp_ext::TestItemKind::Package,
1561+
},
15651562
ide::TestItemKind::Module => lsp_ext::TestItemKind::Module,
15661563
ide::TestItemKind::Function => lsp_ext::TestItemKind::Test,
15671564
},

crates/rust-analyzer/src/target_spec.rs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,7 @@ impl TargetSpec {
2929
_ => return Ok(None),
3030
};
3131

32-
match global_state_snapshot.cargo_target_for_crate_root(crate_id) {
33-
Some((cargo_ws, target)) => {
34-
let target_data = &cargo_ws[target];
35-
let package_data = &cargo_ws[target_data.package];
36-
let res = CargoTargetSpec {
37-
workspace_root: cargo_ws.workspace_root().to_path_buf(),
38-
cargo_toml: package_data.manifest.clone(),
39-
crate_id,
40-
package: cargo_ws.package_flag(package_data),
41-
target: target_data.name.clone(),
42-
target_kind: target_data.kind,
43-
required_features: target_data.required_features.clone(),
44-
features: package_data.features.keys().cloned().collect(),
45-
};
46-
Ok(Some(TargetSpec::Cargo(res)))
47-
}
48-
None => {
49-
tracing::debug!(?crate_id, "no target found");
50-
Ok(None)
51-
}
52-
}
32+
Ok(global_state_snapshot.target_spec_for_crate(crate_id))
5333
}
5434

5535
pub(crate) fn target_kind(&self) -> TargetKind {

0 commit comments

Comments
 (0)