use crate::type_info::TypeInfo; use std::cell::RefCell; use std::rc::Rc; pub struct FunctionSymbol { name: Rc, parameters: Vec>, } impl FunctionSymbol { pub fn new(name: &str, parameters: &[Rc]) -> Self { Self { name: name.into(), parameters: parameters.into(), } } pub fn name(&self) -> &str { &self.name } pub fn name_owned(&self) -> Rc { self.name.clone() } pub fn parameters(&self) -> &[Rc] { &self.parameters } pub fn return_type(&self) -> TypeInfo { todo!() } } pub struct ParameterSymbol { name: Rc, type_info: TypeInfo, stack_frame_offset: Option, } impl ParameterSymbol { pub fn new(name: &str, type_info: TypeInfo) -> Self { Self { name: name.into(), type_info, 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_stack_frame_offset(&mut self, offset: usize) { self.stack_frame_offset = Some(offset); } pub fn stack_frame_offset(&self) -> usize { self.stack_frame_offset.unwrap() } } pub struct VariableSymbol { name: Rc, type_info: TypeInfo, register: Option, } impl VariableSymbol { pub fn new(name: &str, type_info: TypeInfo) -> Self { Self { name: name.into(), type_info, register: 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_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>), }