use std::collections::HashMap;
use crate::ir::IrModule;
pub(super) fn qualified_capacity(module_path: &[String], name_len: usize) -> usize {
module_path
.iter()
.map(String::len)
.sum::<usize>()
.saturating_add(module_path.len().saturating_mul(2))
.saturating_add(name_len)
}
pub(super) fn qualified_name(module_path: &[String], name: &str) -> String {
let mut out = String::with_capacity(qualified_capacity(module_path, name.len()));
for seg in module_path {
out.push_str(seg);
out.push_str("::");
}
out.push_str(name);
out
}
pub(super) fn imported_path_of(
name: &str,
imported_modules: &HashMap<Vec<String>, IrModule>,
) -> Option<Vec<String>> {
if !name.contains("::") {
return None;
}
let mut best: Option<&Vec<String>> = None;
for path in imported_modules.keys() {
let prefix = qualified_name(path, "");
if name.starts_with(&prefix)
&& best.is_none_or(|b| qualified_name(b, "").len() < prefix.len())
{
best = Some(path);
}
}
best.cloned()
}