1use serde::{Deserialize, Serialize};
2
3use super::span::SourceSpan;
4
5#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
6pub struct AstExpression {
7 pub kind: ExprKind,
8 pub span: SourceSpan,
9}
10
11impl AstExpression {
12 pub fn new(kind: ExprKind, span: SourceSpan) -> Self {
13 Self { kind, span }
14 }
15}
16
17#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
18#[serde(tag = "kind", rename_all = "snake_case")]
19pub enum ExprKind {
20 Null,
21 Bool {
22 value: bool,
23 },
24 Int {
25 value: i64,
26 },
27 Float {
28 value: f64,
29 },
30 String {
31 value: String,
32 },
33 Array {
34 items: Vec<AstExpression>,
35 },
36 Identifier {
37 name: String,
38 },
39 Member {
40 receiver: Box<AstExpression>,
41 name: String,
42 },
43 FunctionCall {
44 name: String,
45 args: Vec<AstExpression>,
46 },
47 MethodCall {
48 receiver: Box<AstExpression>,
49 name: String,
50 args: Vec<AstExpression>,
51 },
52 Unary {
53 op: UnaryOp,
54 expr: Box<AstExpression>,
55 },
56 Binary {
57 left: Box<AstExpression>,
58 op: BinaryOp,
59 right: Box<AstExpression>,
60 },
61}
62
63#[derive(Debug, Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
64#[serde(rename_all = "snake_case")]
65pub enum UnaryOp {
66 Not,
67 Neg,
68}
69
70#[derive(Debug, Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
71#[serde(rename_all = "snake_case")]
72pub enum BinaryOp {
73 Or,
74 And,
75 Eq,
76 Ne,
77 Lt,
78 Le,
79 Gt,
80 Ge,
81 Add,
82 Sub,
83 Mul,
84 Div,
85 Rem,
86}
87
88impl BinaryOp {
89 pub fn as_str(self) -> &'static str {
90 match self {
91 Self::Or => "||",
92 Self::And => "&&",
93 Self::Eq => "==",
94 Self::Ne => "!=",
95 Self::Lt => "<",
96 Self::Le => "<=",
97 Self::Gt => ">",
98 Self::Ge => ">=",
99 Self::Add => "+",
100 Self::Sub => "-",
101 Self::Mul => "*",
102 Self::Div => "/",
103 Self::Rem => "%",
104 }
105 }
106}
107
108impl UnaryOp {
109 pub fn as_str(self) -> &'static str {
110 match self {
111 Self::Not => "!",
112 Self::Neg => "-",
113 }
114 }
115}