| use ide_db::{ |
| base_db::{CrateOrigin, SourceDatabase}, |
| FileId, FxIndexSet, RootDatabase, |
| }; |
| |
| #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] |
| pub struct CrateInfo { |
| pub name: Option<String>, |
| pub version: Option<String>, |
| pub root_file_id: FileId, |
| } |
| |
| // Feature: Show Dependency Tree |
| // |
| // Shows a view tree with all the dependencies of this project |
| // |
| // | Editor | Panel Name | |
| // |---------|------------| |
| // | VS Code | **Rust Dependencies** | |
| // |
| //  |
| pub(crate) fn fetch_crates(db: &RootDatabase) -> FxIndexSet<CrateInfo> { |
| let crate_graph = db.crate_graph(); |
| crate_graph |
| .iter() |
| .map(|crate_id| &crate_graph[crate_id]) |
| .filter(|&data| !matches!(data.origin, CrateOrigin::Local { .. })) |
| .map(crate_info) |
| .collect() |
| } |
| |
| fn crate_info(data: &ide_db::base_db::CrateData) -> CrateInfo { |
| let crate_name = crate_name(data); |
| let version = data.version.clone(); |
| CrateInfo { name: crate_name, version, root_file_id: data.root_file_id } |
| } |
| |
| fn crate_name(data: &ide_db::base_db::CrateData) -> Option<String> { |
| data.display_name.as_ref().map(|it| it.canonical_name().as_str().to_owned()) |
| } |