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 MacroDelimiter {
44    Paren,
45    Bracket,
46    Brace,
47}
48
49#[derive(Debug, Clone, Serialize)]
50pub enum Postfix {
51    FieldAccess(Identifier, Option<Generics>),
52    Call(Vec<Expression>),
53    MacroCall {
54        inner: String,
55        delimiter: MacroDelimiter,
56    },
57    StructCall(Vec<(Identifier, Expression)>),
58    Assign(String, Box<Expression>),
59    Index(Expression),
60    As(TypeExpr),
61    Increment,
62    Decrement,
63    Try,
64}
65
66#[derive(Debug, Clone, Serialize)]
67pub enum Prefix {
68    Ref,
69    RefMut,
70    Deref,
71    Not,
72    Neg,
73    Closure(Option<TypeExpr>, Vec<VarDecl>),
74}
75
76#[derive(Debug, Clone, Serialize)]
77pub struct ExprPathSegment {
78    pub ident: Identifier,
79    pub generics: Option<Generics>,
80}
81
82#[derive(Debug, Clone, Serialize)]
83pub struct ExprPath(pub Vec<ExprPathSegment>);
84
85#[derive(Debug, Clone, Serialize)]
86pub struct Generics(pub Vec<Generic>);
87
88#[derive(Debug, Clone, Serialize)]
89pub enum Generic {
90    Lifetime(Identifier),
91    Type(TypeExpr),
92}
93
94impl Expression {
95    pub fn is_block(&self) -> bool {
96        if let Expression::Statement(stmt) = self {
97            stmt.is_block()
98        } else {
99            false
100        }
101    }
102}
103
104impl From<Path> for ExprPath {
105    fn from(path: Path) -> Self {
106        Self(
107            path.0
108                .into_iter()
109                .map(|v| ExprPathSegment {
110                    ident: v,
111                    generics: None,
112                })
113                .collect(),
114        )
115    }
116}