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<Identifier>),
36 Struct(Path, Vec<Identifier>),
37 Tuple(Vec<Identifier>),
38 Literal(Literal),
39 Path(Path),
40 Id(Identifier),
41}
42
43#[derive(Debug, Clone, Serialize)]
44pub enum Postfix {
45 FieldAccess(Identifier, Option<Generics>),
46 Call(Vec<Expression>),
47 MacroCall(String),
48 StructCall(Vec<(Identifier, Expression)>),
49 Assign(String, Box<Expression>),
50 Index(Expression),
51 As(TypeExpr),
52 Increment,
53 Decrement,
54 Try,
55}
56
57#[derive(Debug, Clone, Serialize)]
58pub enum Prefix {
59 Ref,
60 RefMut,
61 Deref,
62 New(Option<Generics>),
63 Not,
64 Neg,
65 Closure(Option<TypeExpr>, Vec<VarDecl>),
66}
67
68#[derive(Debug, Clone, Serialize)]
69pub struct ExprPathSegment {
70 pub ident: Identifier,
71 pub generics: Option<Generics>,
72}
73
74#[derive(Debug, Clone, Serialize)]
75pub struct ExprPath(pub Vec<ExprPathSegment>);
76
77#[derive(Debug, Clone, Serialize)]
78pub struct Generics(pub Vec<Generic>);
79
80#[derive(Debug, Clone, Serialize)]
81pub enum Generic {
82 Lifetime(Identifier),
83 Type(TypeExpr),
84}
85
86impl Expression {
87 pub fn is_block(&self) -> bool {
88 if let Expression::Statement(stmt) = self {
89 stmt.is_block()
90 } else {
91 false
92 }
93 }
94}