1use super::{Name, Pattern, Stmt, Type, VersionCond};
4use crate::source::token::Span;
5
6#[derive(Debug, Clone, PartialEq)]
7pub struct Expr {
8 pub kind: ExprKind,
9 pub span: Span,
10}
11
12#[derive(Debug, Clone, PartialEq)]
13pub enum ExprKind {
14 Int(i64),
15 Float(f64),
16 Unit {
17 value: String,
18 unit: String,
19 },
20 Str(Vec<StrSeg>),
21 RawStr(String),
22 Char(char),
23 Bool(bool),
24 Null,
25 Ident(String),
26 This,
27 Base,
29 It,
30 Declare {
32 ty: Option<Type>,
33 name: Name,
34 mutable: bool,
35 },
36 TypeOf(Type),
38 NameOf(Box<Expr>),
40 Checked {
43 expr: Box<Expr>,
44 checked: bool,
45 },
46 Default(Option<Type>),
48 Mc(VersionCond),
50 Tuple {
52 items: Vec<Expr>,
53 names: Vec<Option<Name>>,
54 },
55 Collection(Vec<Element>),
57 New {
59 ty: Option<Type>,
60 args: Option<Vec<Arg>>,
61 init: Vec<(Name, Expr)>,
62 items: Vec<super::Stmt>,
66 },
67 NewArray {
71 elem: Option<Type>,
72 rank: usize,
73 sizes: Vec<Expr>,
74 init: Option<Vec<ArrayItem>>,
75 },
76 Lambda {
78 params: Vec<LambdaParam>,
79 body: LambdaBody,
80 asynchronous: bool,
82 },
83 Unary {
84 op: UnOp,
85 expr: Box<Expr>,
86 },
87 Cast {
89 ty: Type,
90 expr: Box<Expr>,
91 },
92 Binary {
93 op: BinOp,
94 left: Box<Expr>,
95 right: Box<Expr>,
96 },
97 Range {
98 from: Box<Expr>,
99 to: Box<Expr>,
100 inclusive: bool,
101 },
102 Is {
104 expr: Box<Expr>,
105 pattern: Box<Pattern>,
106 },
107 As {
109 expr: Box<Expr>,
110 ty: Type,
111 },
112 Has {
114 expr: Box<Expr>,
115 ty: Type,
116 },
117 Conditional {
119 cond: Box<Expr>,
120 then: Box<Expr>,
121 otherwise: Box<Expr>,
122 },
123 With {
125 expr: Box<Expr>,
126 inits: Vec<(Name, Expr)>,
127 },
128 Switch {
130 expr: Box<Expr>,
131 arms: Vec<Arm>,
132 },
133 Call {
134 callee: Box<Expr>,
135 args: Vec<Arg>,
136 },
137 Index {
139 expr: Box<Expr>,
140 args: Vec<Expr>,
141 safe: bool,
143 },
144 TypeArgs {
146 expr: Box<Expr>,
147 args: Vec<Type>,
148 },
149 Member {
151 expr: Box<Expr>,
152 name: Name,
153 safe: bool,
154 },
155 Macro {
158 name: Name,
159 args: Vec<Expr>,
160 },
161 Move(Box<Expr>),
163 NotNull(Box<Expr>),
165 Error,
167}
168
169#[derive(Debug, Clone, PartialEq)]
171pub enum StrSeg {
172 Text(String),
173 Expr(Expr),
174}
175
176#[derive(Debug, Clone, PartialEq)]
178pub enum ArrayItem {
179 Value(Expr),
180 Nested(Vec<ArrayItem>),
182}
183
184impl ArrayItem {
185 pub fn each_value<'e>(&'e self, f: &mut impl FnMut(&'e Expr)) {
187 match self {
188 ArrayItem::Value(e) => f(e),
189 ArrayItem::Nested(items) => items.iter().for_each(|i| i.each_value(f)),
190 }
191 }
192}
193
194#[derive(Debug, Clone, PartialEq)]
196pub enum Element {
197 Item(Expr),
198 Entry(Expr, Expr),
199 Spread(Expr),
200}
201
202#[derive(Debug, Clone, PartialEq)]
204pub struct LambdaParam {
205 pub ty: Option<Type>,
206 pub name: Name,
207}
208
209#[derive(Debug, Clone, PartialEq)]
210pub enum LambdaBody {
211 Expr(Box<Expr>),
212 Block(Vec<Stmt>),
213}
214
215#[derive(Debug, Clone, PartialEq)]
217pub struct Arg {
218 pub name: Option<Name>,
219 pub pass: Option<super::Pass>,
220 pub value: Expr,
221}
222
223#[derive(Debug, Clone, PartialEq)]
225pub struct Arm {
226 pub pattern: Pattern,
227 pub guard: Option<Expr>,
228 pub value: Expr,
229}
230
231#[derive(Debug, Clone, Copy, PartialEq, Eq)]
232pub enum UnOp {
233 Neg,
234 Not,
235 BitNot,
237 Increment,
239 Decrement,
240 PostIncrement,
242 PostDecrement,
243 Try,
244 Await,
245 FromEnd,
247}
248
249impl UnOp {
250 pub fn steps(self) -> bool {
252 matches!(
253 self,
254 UnOp::Increment | UnOp::Decrement | UnOp::PostIncrement | UnOp::PostDecrement
255 )
256 }
257
258 pub fn declared(self) -> UnOp {
260 match self {
261 UnOp::PostIncrement => UnOp::Increment,
262 UnOp::PostDecrement => UnOp::Decrement,
263 op => op,
264 }
265 }
266}
267
268#[derive(Debug, Clone, Copy, PartialEq, Eq)]
269pub enum BinOp {
270 Coalesce,
271 Or,
272 And,
273 Eq,
274 NotEq,
275 Lt,
276 LtEq,
277 Gt,
278 GtEq,
279 In,
280 Add,
281 Sub,
282 Mul,
283 Div,
284 Rem,
285 BitAnd,
287 BitOr,
288 BitXor,
289 Shl,
291 Shr,
292}