use std::collections::BTreeSet;
use crate::ir::facts::UsePathFact;
use crate::ir::sites::{ReferenceOrigin, ReferenceSite};
pub(super) fn project_use_paths(references: &[ReferenceSite]) -> Box<[UsePathFact]> {
let mut seen: BTreeSet<Box<str>> = BTreeSet::new();
references
.iter()
.filter_map(|site| projected(site, &mut seen))
.collect()
}
fn projected(site: &ReferenceSite, seen: &mut BTreeSet<Box<str>>) -> Option<UsePathFact> {
match site.origin() {
ReferenceOrigin::Import => Some(fact(site)),
ReferenceOrigin::ExpressionPath => seen.insert(site.text.clone()).then(|| fact(site)),
_ => None,
}
}
fn fact(site: &ReferenceSite) -> UsePathFact {
UsePathFact {
path: site.text.clone(),
span: site.range.start,
}
}