remove one more dependency on source roots

This commit is contained in:
Aleksey Kladov 2019-10-14 15:15:47 +03:00
parent 77f2dd96a1
commit 1555a1aa0d
3 changed files with 26 additions and 21 deletions

View File

@ -141,14 +141,8 @@ mod tests {
#[test]
fn test_loading_rust_analyzer() {
let path = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap().parent().unwrap();
let (host, roots) = load_cargo(path).unwrap();
let mut n_crates = 0;
for (root, _) in roots {
for _krate in Crate::source_root_crates(host.raw_database(), root) {
n_crates += 1;
}
}
let (host, _roots) = load_cargo(path).unwrap();
let n_crates = Crate::all(host.raw_database()).len();
// RA has quite a few crates, but the exact count doesn't matter
assert!(n_crates > 20);
}

View File

@ -22,16 +22,29 @@ pub fn run(
let mut num_crates = 0;
let mut visited_modules = HashSet::new();
let mut visit_queue = Vec::new();
for (source_root_id, project_root) in roots {
if project_root.is_member() {
for krate in Crate::source_root_crates(db, source_root_id) {
num_crates += 1;
let module =
krate.root_module(db).expect("crate in source root without root module");
visit_queue.push(module);
}
let members = roots
.into_iter()
.filter_map(
|(source_root_id, project_root)| {
if project_root.is_member() {
Some(source_root_id)
} else {
None
}
},
)
.collect::<HashSet<_>>();
for krate in Crate::all(db) {
let module = krate.root_module(db).expect("crate without root module");
let file_id = module.definition_source(db).file_id;
if members.contains(&db.file_source_root(file_id.original_file(db))) {
num_crates += 1;
visit_queue.push(module);
}
}
println!("Crates in this dir: {}", num_crates);
let mut num_decls = 0;
let mut funcs = Vec::new();

View File

@ -5,7 +5,7 @@
use std::sync::Arc;
use ra_db::{CrateId, Edition, FileId, SourceRootId};
use ra_db::{CrateId, Edition, FileId};
use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner};
use crate::{
@ -76,10 +76,8 @@ pub fn edition(self, db: &impl DefDatabase) -> Edition {
crate_graph.edition(self.crate_id)
}
// FIXME: should this be in source_binder?
pub fn source_root_crates(db: &impl DefDatabase, source_root: SourceRootId) -> Vec<Crate> {
let crate_ids = db.source_root_crates(source_root);
crate_ids.iter().map(|&crate_id| Crate { crate_id }).collect()
pub fn all(db: &impl DefDatabase) -> Vec<Crate> {
db.crate_graph().iter().map(|crate_id| Crate { crate_id }).collect()
}
}