use crate::ast::expression_statement::ExpressionStatement; use crate::ast::function::FunctionLoweringContext; use crate::ast::let_statement::LetStatement; use crate::diagnostic::Diagnostic; use crate::symbol_table::SymbolTable; pub enum Statement { Let(LetStatement), Expression(ExpressionStatement), } impl Statement { pub fn gather_declared_names(&mut self, symbol_table: &mut SymbolTable) -> Vec { match self { Statement::Let(let_statement) => let_statement.gather_declared_names(symbol_table), Statement::Expression(expression_statement) => { expression_statement.gather_declared_names(symbol_table) } } } pub fn check_name_usages(&mut self, symbol_table: &SymbolTable) -> Vec { match self { Statement::Let(let_statement) => let_statement.check_name_usages(symbol_table), Statement::Expression(expression_statement) => { expression_statement.check_name_usages(symbol_table) } } } pub fn type_check(&mut self, symbol_table: &SymbolTable) -> Vec { match self { Statement::Let(let_statement) => let_statement.type_check(symbol_table), Statement::Expression(expression_statement) => { expression_statement.type_check(symbol_table) } } } pub fn lower_to_ir(&self, context: &mut FunctionLoweringContext) { match self { Statement::Let(let_statement) => { let_statement.lower_to_ir(context); } Statement::Expression(expression) => { expression.lower_to_ir(context); } } } }