use crate::types::Type;
use cranelift::prelude::{types, Type as ClifType};
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum Operation {
Add(Box<Expression>, Box<Expression>),
Sub(Box<Expression>, Box<Expression>),
Mul(Box<Expression>, Box<Expression>),
Div(Box<Expression>, Box<Expression>),
Assign(Box<Expression>, Box<Expression>),
Equals(Box<Expression>, Box<Expression>),
Gt(Box<Expression>, Box<Expression>),
Lt(Box<Expression>, Box<Expression>),
GtEq(Box<Expression>, Box<Expression>),
LtEq(Box<Expression>, Box<Expression>),
Index(String, usize),
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum Definition {
Variable(String, Type, Box<Expression>),
Function(String, Vec<Box<Definition>>, Type, Vec<Box<Expression>>),
Argument(String, Type),
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum Expression {
Define(Definition),
Type(Type),
String(String),
Number(i32),
Float(f32),
Identifier(String),
Field(String, String),
Operation(Operation),
Block(Vec<Box<Expression>>),
Return(Box<Expression>),
None,
Property(String, String),
If(Vec<Box<Expression>>, Vec<Box<Expression>>),
Call(String, Vec<Box<Expression>>),
MethodCall(Vec<String>, String, Vec<Box<Expression>>),
}
impl Expression {
pub fn get_type(self) -> ClifType {
match self {
Expression::String(_) => types::I64,
Expression::Number(_) => types::I32,
Expression::Float(_) => types::F32,
Expression::Identifier(_) => types::I32,
_ => types::I32,
}
}
}