use leo_ast::*;
use leo_errors::emitter::Handler;
use crate::{SymbolTable, VariableSymbol, VariableType};
pub struct SymbolTableCreator<'a> {
pub(crate) symbol_table: SymbolTable,
handler: &'a Handler,
}
impl<'a> SymbolTableCreator<'a> {
pub fn new(handler: &'a Handler) -> Self {
Self { symbol_table: Default::default(), handler }
}
}
impl<'a> ExpressionVisitor<'a> for SymbolTableCreator<'a> {
type AdditionalInput = ();
type Output = ();
}
impl<'a> StatementVisitor<'a> for SymbolTableCreator<'a> {}
impl<'a> ProgramVisitor<'a> for SymbolTableCreator<'a> {
fn visit_import(&mut self, input: &'a Program) {
self.visit_program(input)
}
fn visit_struct(&mut self, input: &'a Struct) {
if let Err(err) = self.symbol_table.insert_struct(input.name(), input) {
self.handler.emit_err(err);
}
}
fn visit_mapping(&mut self, input: &'a Mapping) {
if let Err(err) = self.symbol_table.insert_variable(input.identifier.name, VariableSymbol {
type_: Type::Mapping(MappingType {
key: Box::new(input.key_type.clone()),
value: Box::new(input.value_type.clone()),
}),
span: input.span,
declaration: VariableType::Mut,
}) {
self.handler.emit_err(err);
}
}
fn visit_function(&mut self, input: &'a Function) {
if let Err(err) = self.symbol_table.insert_fn(input.name(), input) {
self.handler.emit_err(err);
}
}
}