82 lines
2.7 KiB
Rust
82 lines
2.7 KiB
Rust
use crate::builtins::bool;
|
|
use std::sync::Arc;
|
|
|
|
use crate::{
|
|
ast::{BinOp, ClauseGuard, Constant, UnOp},
|
|
tipo::Type,
|
|
};
|
|
|
|
use super::tree::AirTree;
|
|
|
|
pub fn convert_opaque_type() -> Arc<Type> {
|
|
todo!()
|
|
}
|
|
|
|
pub fn constants_ir(literal: &Constant) -> AirTree {
|
|
match literal {
|
|
Constant::Int { value, .. } => AirTree::int(value),
|
|
Constant::String { value, .. } => AirTree::string(value),
|
|
Constant::ByteArray { bytes, .. } => AirTree::byte_array(bytes.clone()),
|
|
}
|
|
}
|
|
|
|
pub fn handle_clause_guard(clause_guard: &ClauseGuard<Arc<Type>>) -> AirTree {
|
|
match clause_guard {
|
|
ClauseGuard::Not { value, .. } => {
|
|
let val = handle_clause_guard(value);
|
|
|
|
AirTree::unop(UnOp::Not, val)
|
|
}
|
|
ClauseGuard::Equals { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::Eq, bool(), left, right)
|
|
}
|
|
ClauseGuard::NotEquals { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::NotEq, bool(), left, right)
|
|
}
|
|
ClauseGuard::GtInt { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::GtInt, bool(), left, right)
|
|
}
|
|
ClauseGuard::GtEqInt { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::GtEqInt, bool(), left, right)
|
|
}
|
|
ClauseGuard::LtInt { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::LtInt, bool(), left, right)
|
|
}
|
|
ClauseGuard::LtEqInt { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::LtEqInt, bool(), left, right)
|
|
}
|
|
ClauseGuard::Or { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::Or, bool(), left, right)
|
|
}
|
|
ClauseGuard::And { left, right, .. } => {
|
|
let left = handle_clause_guard(left);
|
|
let right = handle_clause_guard(right);
|
|
|
|
AirTree::binop(BinOp::And, bool(), left, right)
|
|
}
|
|
ClauseGuard::Var { tipo, name, .. } => AirTree::local_var(name, tipo.clone()),
|
|
ClauseGuard::Constant(constant) => constants_ir(constant),
|
|
}
|
|
}
|