pub mod meta;
use crate::{FlycatcherType, SymbolTable, VariableType};
pub use meta::HirMeta;
#[derive(Clone, Debug)]
pub enum Hir<'a> {
Boolean(bool),
Integer(i64),
UnsignedInteger(u64),
Float(f64),
Named(String),
Add(Box<HirMeta<'a>>, Box<HirMeta<'a>>),
Subtract(Box<HirMeta<'a>>, Box<HirMeta<'a>>),
Multiply(Box<HirMeta<'a>>, Box<HirMeta<'a>>),
Divide(Box<HirMeta<'a>>, Box<HirMeta<'a>>),
Set(Box<HirMeta<'a>>, Box<HirMeta<'a>>),
}
impl<'a> Hir<'a> {
pub fn get_type(&self, symbols: &SymbolTable) -> FlycatcherType {
match self {
Hir::Boolean(_) => FlycatcherType::Boolean,
Hir::Integer(_) => FlycatcherType::Size,
Hir::UnsignedInteger(_) => FlycatcherType::Usize,
Hir::Float(_) => FlycatcherType::Float64,
Hir::Named(n) => {
let v = symbols.get(n).unwrap();
match v {
VariableType::Declared(t) => *t,
VariableType::Defined(t, _, _) => *t
}
},
Hir::Add(l, r) => l.item.get_type(symbols),
Hir::Subtract(l, r) => l.item.get_type(symbols),
Hir::Multiply(l, r) => l.item.get_type(symbols),
Hir::Divide(l, r) => l.item.get_type(symbols),
_ => panic!("This HIR object has no type.")
}
}
}