use sourcemap::DecodedMap;
use crate::{NameComponent, ScopeName, SourceContext};
pub struct NameResolver<'a, T> {
ctx: &'a SourceContext<T>,
sourcemap: &'a DecodedMap,
}
impl<'a, T: AsRef<str>> NameResolver<'a, T> {
pub fn new(ctx: &'a SourceContext<T>, sourcemap: &'a DecodedMap) -> Self {
Self { ctx, sourcemap }
}
pub fn resolve_name(&self, name: &ScopeName) -> String {
name.components()
.map(|c| self.try_map_token(c).unwrap_or_else(|| c.text()))
.collect::<String>()
}
fn try_map_token(&self, c: &NameComponent) -> Option<&str> {
let range = c.range()?;
let source_position = self.ctx.offset_to_position(range.start)?;
let token = self
.sourcemap
.lookup_token(source_position.line, source_position.column)?;
let is_exactish_match = token.get_dst_line() == source_position.line
&& token.get_dst_col() >= source_position.column.saturating_sub(1);
if is_exactish_match {
token.get_name()
} else {
None
}
}
}