Skip to main content

rue_hir/
hir.rs

1use id_arena::Id;
2use num_bigint::BigInt;
3use rue_diagnostic::SrcLoc;
4use rue_lir::ClvmOp;
5
6use crate::{BinaryOp, SymbolId, UnaryOp};
7
8pub type HirId = Id<Hir>;
9
10#[derive(Debug, Clone)]
11pub enum Hir {
12    Unresolved,
13    Nil,
14    String(String),
15    Int(BigInt),
16    Bytes(Vec<u8>),
17    Bool(bool),
18    Pair(HirId, HirId),
19    Const(ConstExpr),
20    Reference(SymbolId),
21    Block(Block),
22    Lambda(SymbolId),
23    If(HirId, HirId, HirId, bool),
24    FunctionCall(FunctionCall),
25    Unary(UnaryOp, HirId),
26    Binary(BinaryOp, HirId, HirId),
27    CoinId(HirId, HirId, HirId),
28    Substr(HirId, HirId, Option<HirId>),
29    G1Map(HirId, Option<HirId>),
30    G2Map(HirId, Option<HirId>),
31    Modpow(HirId, HirId, HirId),
32    BlsPairingIdentity(Vec<HirId>),
33    BlsVerify(HirId, Vec<HirId>),
34    Secp256K1Verify(HirId, HirId, HirId),
35    Secp256R1Verify(HirId, HirId, HirId),
36    InfinityG1,
37    InfinityG2,
38    ClvmOp(ClvmOp, HirId),
39}
40
41#[derive(Debug, Clone)]
42pub struct ConstExpr {
43    pub value: HirId,
44    pub loc: SrcLoc,
45}
46
47#[derive(Debug, Clone)]
48pub struct Block {
49    pub statements: Vec<Statement>,
50    pub body: Option<HirId>,
51}
52
53#[derive(Debug, Clone)]
54pub enum Statement {
55    Expr(ExprStatement),
56    Let(SymbolId),
57    If(IfStatement),
58    Return(HirId),
59    Assert(HirId, SrcLoc),
60    Raise(Option<HirId>, SrcLoc),
61    Debug(HirId, SrcLoc),
62}
63
64#[derive(Debug, Clone, Copy)]
65pub struct ExprStatement {
66    pub hir: HirId,
67    pub always_nil: bool,
68}
69
70#[derive(Debug, Clone, Copy)]
71pub struct IfStatement {
72    pub condition: HirId,
73    pub then: HirId,
74    pub inline: bool,
75}
76
77#[derive(Debug, Clone)]
78pub struct FunctionCall {
79    pub function: HirId,
80    pub args: Vec<HirId>,
81    pub nil_terminated: bool,
82}