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}