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<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}