1use serde::Serialize;
2
3use super::*;
4
5#[derive(Debug, Clone, Serialize)]
6pub enum Expression {
7 Literal(Literal),
8 Path(ExprPath),
9 Statement(Box<Statement>),
10 Fix {
11 initial: Box<Expression>,
12 prefixes: Vec<Prefix>,
13 postfixes: Vec<Postfix>,
14 },
15 Binary {
16 lhs: Box<Expression>,
17 op: String,
18 rhs: Box<Expression>,
19 },
20}
21
22#[derive(Debug, Clone, Serialize)]
23pub enum Literal {
24 String(String),
25 Int(i64),
26 Float(f64),
27 Bool(bool),
28 Tuple(Vec<Expression>),
29 Array(Vec<Expression>),
30 ArrayRepeat(Box<Expression>, Box<Expression>),
31}
32
33#[derive(Debug, Clone, Serialize)]
34pub enum Pattern {
35 NamedTuple(Path, Vec<Box<Pattern>>),
36 Struct(Path, Vec<Box<Pattern>>),
37 Tuple(Vec<Box<Pattern>>),
38 Literal(Literal),
39 Path(bool, Path),
40}
41
42#[derive(Debug, Clone, Serialize)]
43pub enum Postfix {
44 FieldAccess(Identifier, Option<Generics>),
45 Call(Vec<Expression>),
46 MacroCall(String),
47 StructCall(Vec<(Identifier, Expression)>),
48 Assign(String, Box<Expression>),
49 Index(Expression),
50 As(TypeExpr),
51 Increment,
52 Decrement,
53 Try,
54}
55
56#[derive(Debug, Clone, Serialize)]
57pub enum Prefix {
58 Ref,
59 RefMut,
60 Deref,
61 New(Option<Generics>),
62 Not,
63 Neg,
64 Closure(Option<TypeExpr>, Vec<VarDecl>),
65}
66
67#[derive(Debug, Clone, Serialize)]
68pub struct ExprPathSegment {
69 pub ident: Identifier,
70 pub generics: Option<Generics>,
71}
72
73#[derive(Debug, Clone, Serialize)]
74pub struct ExprPath(pub Vec<ExprPathSegment>);
75
76#[derive(Debug, Clone, Serialize)]
77pub struct Generics(pub Vec<Generic>);
78
79#[derive(Debug, Clone, Serialize)]
80pub enum Generic {
81 Lifetime(Identifier),
82 Type(TypeExpr),
83}
84
85impl Expression {
86 pub fn is_block(&self) -> bool {
87 if let Expression::Statement(stmt) = self {
88 stmt.is_block()
89 } else {
90 false
91 }
92 }
93}