Skip to main content

regast_core/
ir.rs

1use regast_syntax::{AnchorKind, NodeId};
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
4pub struct IrId(pub(crate) u32);
5
6impl IrId {
7    #[must_use]
8    pub const fn index(self) -> u32 {
9        self.0
10    }
11}
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
14pub struct ClassSetId(pub(crate) u32);
15
16#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
17pub enum Prov {
18    Ast(NodeId),
19    Synth(NodeId),
20}
21
22#[derive(Clone, Debug, PartialEq, Eq, Hash)]
23pub enum IrKind {
24    Zero,
25    One,
26    Anchor(AnchorKind, Prov),
27    Class(ClassSetId, Prov),
28    Alt(IrId, IrId, Prov, bool),
29    Seq(IrId, IrId, Prov),
30    Star(IrId, Prov, bool),
31}
32
33impl IrKind {
34    #[must_use]
35    pub const fn provenance(&self) -> Option<Prov> {
36        match self {
37            Self::Zero | Self::One => None,
38            Self::Anchor(_, prov)
39            | Self::Class(_, prov)
40            | Self::Alt(_, _, prov, _)
41            | Self::Seq(_, _, prov)
42            | Self::Star(_, prov, _) => Some(*prov),
43        }
44    }
45}