use super::index::DefIndex;
use super::scope::FileContext;
use crate::project::ProjectModel;
use std::collections::HashMap;
use std::sync::Arc;
pub(super) fn attach_reach(
contexts: &mut HashMap<String, FileContext>,
model: Option<&ProjectModel>,
unit_of_file: &HashMap<String, Option<usize>>,
index: &DefIndex,
) {
let Some(model) = model else {
return;
};
let owner = |file: &str| unit_of_file.get(file).copied().flatten();
let declaring_units: Vec<Option<Vec<usize>>> = index
.defs
.iter()
.map(|def| {
std::iter::once(def.file.as_str())
.chain(def.also_in.iter().map(|part| part.file.as_str()))
.map(owner)
.collect()
})
.collect();
let mut by_unit: HashMap<usize, Arc<[bool]>> = HashMap::new();
for (file, context) in contexts.iter_mut() {
let Some(site) = owner(file) else {
continue;
};
let reach = by_unit.entry(site).or_insert_with(|| {
declaring_units
.iter()
.map(|units| {
units
.as_ref()
.is_none_or(|units| units.iter().any(|&u| model.reachable(site, u)))
})
.collect()
});
context.usings.set_reach(Arc::clone(reach));
}
}