Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/fetch_crates.rs')
-rw-r--r--crates/ide/src/fetch_crates.rs52
1 files changed, 29 insertions, 23 deletions
diff --git a/crates/ide/src/fetch_crates.rs b/crates/ide/src/fetch_crates.rs
index ec6d66d5c4..416082ae73 100644
--- a/crates/ide/src/fetch_crates.rs
+++ b/crates/ide/src/fetch_crates.rs
@@ -22,16 +22,21 @@ pub(crate) fn fetch_crates(db: &RootDatabase) -> Vec<CrateInfo> {
.iter()
.map(|crate_id| &crate_graph[crate_id])
.filter(|&data| !matches!(data.origin, CrateOrigin::Local { .. }))
- .map(|data| {
- let crate_name = crate_name(data);
- let version = data.version.clone().unwrap_or_else(|| "".to_owned());
- let crate_path = crate_path(db, data, &crate_name);
-
- CrateInfo { name: crate_name, version, path: crate_path }
- })
+ .filter_map(|data| crate_info(data, db))
.collect()
}
+fn crate_info(data: &ide_db::base_db::CrateData, db: &RootDatabase) -> Option<CrateInfo> {
+ let crate_name = crate_name(data);
+ let crate_path = crate_path(db, data, &crate_name);
+ if let Some(crate_path) = crate_path {
+ let version = data.version.clone().unwrap_or_else(|| "".to_owned());
+ Some(CrateInfo { name: crate_name, version, path: crate_path })
+ } else {
+ None
+ }
+}
+
fn crate_name(data: &ide_db::base_db::CrateData) -> String {
data.display_name
.clone()
@@ -39,27 +44,28 @@ fn crate_name(data: &ide_db::base_db::CrateData) -> String {
.unwrap_or("unknown".to_string())
}
-fn crate_path(db: &RootDatabase, data: &ide_db::base_db::CrateData, crate_name: &str) -> String {
+fn crate_path(
+ db: &RootDatabase,
+ data: &ide_db::base_db::CrateData,
+ crate_name: &str,
+) -> Option<String> {
let source_root_id = db.file_source_root(data.root_file_id);
let source_root = db.source_root(source_root_id);
let source_root_path = source_root.path_for_file(&data.root_file_id);
- match source_root_path.cloned() {
- Some(mut root_path) => {
- let mut crate_path = "".to_string();
- while let Some(vfs_path) = root_path.parent() {
- match vfs_path.name_and_extension() {
- Some((name, _)) => {
- if name.starts_with(crate_name) {
- crate_path = vfs_path.to_string();
- break;
- }
+ source_root_path.cloned().and_then(|mut root_path| {
+ let mut crate_path = None;
+ while let Some(vfs_path) = root_path.parent() {
+ match vfs_path.name_and_extension() {
+ Some((name, _)) => {
+ if name.starts_with(crate_name) {
+ crate_path = Some(vfs_path.to_string());
+ break;
}
- None => break,
}
- root_path = vfs_path;
+ None => break,
}
- crate_path
+ root_path = vfs_path;
}
- None => "".to_owned(),
- }
+ crate_path
+ })
}