Adding crate_root_path to crate_graph

This commit is contained in:
Bruno Ortiz 2023-04-08 13:07:25 -03:00
parent 8e687f7afb
commit a3081a6774
10 changed files with 74 additions and 37 deletions

View file

@ -1,5 +1,5 @@
use ide_db::{
base_db::{CrateOrigin, SourceDatabase, SourceDatabaseExt},
base_db::{CrateOrigin, SourceDatabase},
FxIndexSet, RootDatabase,
};
@ -22,13 +22,13 @@ pub(crate) fn fetch_crates(db: &RootDatabase) -> FxIndexSet<CrateInfo> {
.iter()
.map(|crate_id| &crate_graph[crate_id])
.filter(|&data| !matches!(data.origin, CrateOrigin::Local { .. }))
.filter_map(|data| crate_info(data, db))
.filter_map(|data| crate_info(data))
.collect()
}
fn crate_info(data: &ide_db::base_db::CrateData, db: &RootDatabase) -> Option<CrateInfo> {
fn crate_info(data: &ide_db::base_db::CrateData) -> Option<CrateInfo> {
let crate_name = crate_name(data);
let crate_path = crate_path(db, data, &crate_name);
let crate_path = data.crate_root_path.as_ref().map(|p| p.display().to_string());
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 })
@ -43,29 +43,3 @@ fn crate_name(data: &ide_db::base_db::CrateData) -> String {
.map(|it| it.canonical_name().to_owned())
.unwrap_or("unknown".to_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);
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;
}
crate_path
})
}