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.rs | 52 |
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 + }) } |