use crate::ir::ir_expression::IrExpression; use crate::symbol::class_symbol::ClassSymbol; use crate::symbol::field_symbol::FieldSymbol; use crate::symbol::function_symbol::FunctionSymbol; use crate::symbol::parameter_symbol::ParameterSymbol; use crate::symbol::variable_symbol::VariableSymbol; use crate::type_info::TypeInfo; use std::cell::RefCell; use std::rc::Rc; pub enum ExpressibleSymbol { Class(Rc>), Field(Rc>), Function(Rc>), Parameter(Rc>), Variable(Rc>), } impl ExpressibleSymbol { pub fn type_info(&self) -> TypeInfo { match self { ExpressibleSymbol::Class(class_symbol) => { todo!() } ExpressibleSymbol::Field(field_symbol) => { todo!() } ExpressibleSymbol::Function(function_symbol) => { TypeInfo::Function(function_symbol.clone()) // n.b. not the return type! } ExpressibleSymbol::Parameter(parameter_symbol) => { parameter_symbol.borrow().type_info().clone() } ExpressibleSymbol::Variable(variable_symbol) => { variable_symbol.borrow().type_info().clone() } } } pub fn ir_expression(&self) -> IrExpression { match self { ExpressibleSymbol::Class(class_symbol) => { todo!() } ExpressibleSymbol::Field(field_symbol) => { todo!() } 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().vr_variable().clone()) } } } }