use crate::ir::ir_expression::IrExpression; use crate::ir::ir_parameter::IrParameter; use crate::ir::ir_variable::IrVariable; use crate::type_info::TypeInfo; use std::cell::RefCell; use std::rc::Rc; pub struct FunctionSymbol { name: Rc, is_platform: bool, parameters: Option>>>, return_type: TypeInfo, } impl FunctionSymbol { pub fn new(name: &str, is_platform: bool, return_type: TypeInfo) -> Self { Self { name: name.into(), is_platform, parameters: None, return_type, } } pub fn name(&self) -> &str { &self.name } pub fn name_owned(&self) -> Rc { self.name.clone() } pub fn set_parameters(&mut self, parameters: Vec>>) { self.parameters = Some(parameters); } pub fn parameters(&self) -> &[Rc>] { self.parameters.as_ref().unwrap() } pub fn return_type(&self) -> TypeInfo { self.return_type.clone() } pub fn is_platform(&self) -> bool { self.is_platform } } pub struct ParameterSymbol { name: Rc, type_info: TypeInfo, ir_parameter: Option>, #[deprecated] stack_frame_offset: Option, } impl ParameterSymbol { pub fn new(name: &str, type_info: TypeInfo) -> Self { Self { name: name.into(), type_info, ir_parameter: None, stack_frame_offset: None, } } pub fn name(&self) -> &str { &self.name } pub fn name_owned(&self) -> Rc { self.name.clone() } pub fn type_info(&self) -> &TypeInfo { &self.type_info } pub fn set_ir_parameter(&mut self, ir_parameter: Rc) { self.ir_parameter = Some(ir_parameter); } pub fn ir_parameter(&self) -> &Rc { self.ir_parameter.as_ref().unwrap() } #[deprecated] pub fn set_stack_frame_offset(&mut self, offset: isize) { self.stack_frame_offset = Some(offset); } #[deprecated] pub fn stack_frame_offset(&self) -> isize { self.stack_frame_offset.unwrap() } } pub struct VariableSymbol { name: Rc, type_info: Option, ir_variable: Option>, #[deprecated] register: Option, } impl VariableSymbol { pub fn new(name: &str) -> Self { Self { name: name.into(), type_info: None, ir_variable: None, register: None, } } pub fn name(&self) -> &str { &self.name } pub fn name_owned(&self) -> Rc { self.name.clone() } pub fn set_type_info(&mut self, type_info: TypeInfo) { self.type_info = Some(type_info); } pub fn type_info(&self) -> &TypeInfo { self.type_info .as_ref() .expect("TypeInfo not initialized. Did you type check?") } pub fn set_ir_variable(&mut self, ir_variable: Rc) { self.ir_variable = Some(ir_variable); } pub fn ir_variable(&self) -> &Rc { self.ir_variable .as_ref() .expect("ir_variable not yet initialized") } pub fn set_register(&mut self, register: usize) { self.register = Some(register); } pub fn register(&self) -> usize { self.register.unwrap() } } pub enum ExpressibleSymbol { Function(Rc>), Parameter(Rc>), Variable(Rc>), } impl ExpressibleSymbol { pub fn ir_expression(&self) -> IrExpression { match self { ExpressibleSymbol::Function(_) => { panic!("Cannot get ir_variable for FunctionSymbol"); } ExpressibleSymbol::Parameter(parameter_symbol) => { IrExpression::Parameter(parameter_symbol.borrow().ir_parameter().clone()) } ExpressibleSymbol::Variable(variable_symbol) => { IrExpression::Variable(variable_symbol.borrow().ir_variable().clone()) } } } }