use crate::error::{Result, SourceLocation};
use crate::scope::ScopeManager;
use crate::symbols::Symbol;
pub struct NameResolver {
scope_manager: ScopeManager,
}
impl NameResolver {
pub fn new(scope_manager: ScopeManager) -> Self {
Self { scope_manager }
}
pub fn resolve_name(&self, name: &str, location: &SourceLocation) -> Result<&Symbol> {
self.scope_manager.lookup(name).ok_or_else(|| {
crate::error::SemanticError::UndefinedSymbol {
name: name.to_string(),
location: location.clone(),
}
})
}
pub fn resolve_qualified_name(
&self,
parts: &[String],
location: &SourceLocation,
) -> Result<&Symbol> {
if parts.is_empty() {
return Err(crate::error::SemanticError::AnalysisError(
"Empty qualified name".to_string(),
));
}
if parts.len() == 1 {
return self.resolve_name(&parts[0], location);
}
let _container = self.resolve_name(&parts[0], location)?;
Err(crate::error::SemanticError::AnalysisError(format!(
"Qualified name resolution not yet fully implemented: {}",
parts.join(".")
)))
}
pub fn is_accessible(&self, symbol: &Symbol) -> bool {
self.scope_manager.can_access(symbol)
}
pub fn scope_manager(&self) -> &ScopeManager {
&self.scope_manager
}
}