use crate::ir::ir_add::IrAdd; use crate::ir::ir_call::IrCall; use crate::ir::ir_expression::IrExpression; use crate::ir::ir_variable::IrVariable; use std::collections::HashSet; use std::fmt::{Display, Formatter}; use std::rc::Rc; pub enum IrOperation { Load(IrExpression), Add(IrAdd), Call(IrCall), } impl Display for IrOperation { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { IrOperation::Load(ir_expression) => { write!(f, "{}", ir_expression) } IrOperation::Add(ir_add) => { write!(f, "{}", ir_add) } IrOperation::Call(ir_call) => { write!(f, "{}", ir_call) } } } } impl IrOperation { pub fn uses(&self) -> HashSet> { match self { IrOperation::Load(ir_expression) => ir_expression.uses(), IrOperation::Add(ir_add) => ir_add.uses(), IrOperation::Call(ir_call) => ir_call.uses(), } } }