60 lines
2.0 KiB
Rust
60 lines
2.0 KiB
Rust
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<RefCell<ClassSymbol>>),
|
|
Field(Rc<RefCell<FieldSymbol>>),
|
|
Function(Rc<RefCell<FunctionSymbol>>),
|
|
Parameter(Rc<RefCell<ParameterSymbol>>),
|
|
Variable(Rc<RefCell<VariableSymbol>>),
|
|
}
|
|
|
|
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())
|
|
}
|
|
}
|
|
}
|
|
}
|