deskc_amir/
stmt.rs

1use std::collections::HashMap;
2
3use link::LinkName;
4use types::{Effect, Type};
5
6use crate::{amir::AmirId, block::BlockId, var::VarId};
7
8#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Clone, Debug, PartialEq)]
10pub struct StmtBind<T = AStmt> {
11    pub var: VarId,
12    pub stmt: T,
13}
14
15#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
16#[derive(Clone, Debug, PartialEq)]
17pub enum AStmt {
18    Const(Const),
19    Product(Vec<VarId>),
20    Array(Vec<VarId>),
21    Set(Vec<VarId>),
22    Fn(FnRef),
23    Perform(VarId),
24    MatchResult(VarId),
25    Apply {
26        function: VarId,
27        arguments: Vec<VarId>,
28    },
29    Op {
30        op: Op,
31        operands: Vec<VarId>,
32    },
33    Cast(VarId),
34    Parameter,
35    Recursion,
36    Link(LinkName),
37}
38
39#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
40#[derive(Clone, Debug, PartialEq)]
41pub enum FnRef {
42    Link(Type),
43    Closure {
44        amir: AmirId,
45        /// Caputerd variables
46        captured: Vec<VarId>,
47        /// Used to create an effectful expression
48        handlers: HashMap<Effect, VarId>,
49    },
50}
51
52#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
53#[derive(Clone, Debug, PartialEq)]
54pub enum Const {
55    Int(i64),
56    Rational(i64, i64),
57    Float(f64),
58    String(String),
59}
60
61#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
62#[derive(Clone, Debug, PartialEq)]
63pub enum Op {
64    Add,
65    Sub,
66    Mul,
67    Div,
68    Rem,
69    Mod,
70    Pow,
71    Eq,
72    Neq,
73    Lt,
74    Le,
75    Gt,
76    Ge,
77    Not,
78    Neg,
79    Pos,
80    Shl,
81    Shr,
82    BitAnd,
83    BitOr,
84    BitXor,
85    BitNot,
86}
87
88#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
89#[derive(Clone, Debug, PartialEq)]
90pub struct MatchCase<T = Type> {
91    pub ty: T,
92    pub next: BlockId,
93}
94
95#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
96#[derive(Clone, Debug, PartialEq)]
97pub enum ATerminator<T = Type> {
98    Return(VarId),
99    Match {
100        var: VarId,
101        cases: Vec<MatchCase<T>>,
102    },
103    Goto(BlockId),
104}
105
106#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
107#[derive(Clone, Debug, PartialEq, Hash, Eq)]
108pub struct ALink<T = Type> {
109    pub name: LinkName,
110    pub ty: T,
111}