deimos-lang/dmc-lib/src/ir/ir_operation.rs

64 lines
2.2 KiB
Rust

use crate::ir::ir_allocate::IrAllocate;
use crate::ir::ir_binary_operation::IrBinaryOperation;
use crate::ir::ir_call::IrCall;
use crate::ir::ir_expression::IrExpression;
use crate::ir::ir_get_field_ref::IrGetFieldRef;
use crate::ir::ir_get_field_ref_mut::IrGetFieldRefMut;
use crate::ir::ir_read_field::IrReadField;
use crate::ir::ir_variable::IrVariableId;
use crate::ir::register_allocation::VrUser;
use std::collections::HashSet;
use std::fmt::{Display, Formatter};
pub enum IrOperation {
GetFieldRef(IrGetFieldRef),
GetFieldRefMut(IrGetFieldRefMut),
ReadField(IrReadField),
Load(IrExpression),
Binary(IrBinaryOperation),
Call(IrCall),
Allocate(IrAllocate),
}
impl Display for IrOperation {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
IrOperation::GetFieldRef(ir_get_field_ref) => {
write!(f, "{}", ir_get_field_ref)
}
IrOperation::GetFieldRefMut(ir_get_field_ref_mut) => {
write!(f, "{}", ir_get_field_ref_mut)
}
IrOperation::ReadField(ir_read_field) => {
write!(f, "{}", ir_read_field)
}
IrOperation::Load(ir_expression) => {
write!(f, "{}", ir_expression)
}
IrOperation::Binary(ir_binary_operation) => {
write!(f, "{}", ir_binary_operation)
}
IrOperation::Call(ir_call) => {
write!(f, "{}", ir_call)
}
IrOperation::Allocate(ir_allocate) => {
write!(f, "{}", ir_allocate)
}
}
}
}
impl VrUser for IrOperation {
fn vr_uses(&self) -> HashSet<IrVariableId> {
match self {
IrOperation::GetFieldRef(ir_get_field_ref) => ir_get_field_ref.vr_uses(),
IrOperation::GetFieldRefMut(ir_get_field_ref_mut) => ir_get_field_ref_mut.vr_uses(),
IrOperation::ReadField(ir_read_field) => ir_read_field.vr_uses(),
IrOperation::Load(ir_expression) => ir_expression.vr_uses(),
IrOperation::Binary(ir_binary) => ir_binary.vr_uses(),
IrOperation::Call(ir_call) => ir_call.vr_uses(),
IrOperation::Allocate(_) => HashSet::new(),
}
}
}