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}