Skip to main content

mist_parser/ast/
expr.rs

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}