1use crate::ir::span::Span;
2
3#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
5pub struct BindingExpr {
6 pub expr: Expr,
7 pub span: Span,
8}
9
10#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
12pub enum Expr {
13 FieldAccess(FieldAccessExpr),
14 MethodCall(MethodCallExpr),
15 BinaryOp(BinaryOpExpr),
16 UnaryOp(UnaryOpExpr),
17 Conditional(ConditionalExpr),
18 Literal(LiteralExpr),
19}
20
21#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
23pub struct FieldAccessExpr {
24 pub path: Vec<String>,
25}
26
27#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
29pub struct MethodCallExpr {
30 pub receiver: Box<Expr>,
31 pub method: String,
32 pub args: Vec<Expr>,
33}
34
35#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
37pub struct BinaryOpExpr {
38 pub left: Box<Expr>,
39 pub op: BinaryOp,
40 pub right: Box<Expr>,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
44pub enum BinaryOp {
45 Eq,
46 Ne,
47 Lt,
48 Le,
49 Gt,
50 Ge,
51 And,
52 Or,
53 Add,
54 Sub,
55 Mul,
56 Div,
57}
58
59#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
61pub struct UnaryOpExpr {
62 pub op: UnaryOp,
63 pub operand: Box<Expr>,
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
67pub enum UnaryOp {
68 Not,
69 Neg,
70}
71
72#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
74pub struct ConditionalExpr {
75 pub condition: Box<Expr>,
76 pub then_branch: Box<Expr>,
77 pub else_branch: Box<Expr>,
78}
79
80#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
82pub enum LiteralExpr {
83 String(String),
84 Integer(i64),
85 Float(f64),
86 Bool(bool),
87}