|  | use ide_db::{ | 
|  | FileId, FxIndexSet, RootDatabase, | 
|  | base_db::{CrateOrigin, RootQueryDb}, | 
|  | }; | 
|  |  | 
|  | #[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> { | 
|  | db.all_crates() | 
|  | .iter() | 
|  | .copied() | 
|  | .map(|crate_id| (crate_id.data(db), crate_id.extra_data(db))) | 
|  | .filter(|(data, _)| !matches!(data.origin, CrateOrigin::Local { .. })) | 
|  | .map(|(data, extra_data)| crate_info(data, extra_data)) | 
|  | .collect() | 
|  | } | 
|  |  | 
|  | fn crate_info( | 
|  | data: &ide_db::base_db::BuiltCrateData, | 
|  | extra_data: &ide_db::base_db::ExtraCrateData, | 
|  | ) -> CrateInfo { | 
|  | let crate_name = crate_name(extra_data); | 
|  | let version = extra_data.version.clone(); | 
|  | CrateInfo { name: crate_name, version, root_file_id: data.root_file_id } | 
|  | } | 
|  |  | 
|  | fn crate_name(data: &ide_db::base_db::ExtraCrateData) -> Option<String> { | 
|  | data.display_name.as_ref().map(|it| it.canonical_name().as_str().to_owned()) | 
|  | } |