pomsky_syntax/exprs/
reference.rs

1//! Implements ([relative](https://www.regular-expressions.info/backrefrel.html))
2//! [backreferences](https://www.regular-expressions.info/backref.html),
3//! [forward references](https://www.regular-expressions.info/backref2.html#forward) and
4//! [named references](https://www.regular-expressions.info/named.html).
5
6use crate::Span;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10pub struct Reference {
11    pub target: ReferenceTarget,
12    pub span: Span,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq)]
16pub enum ReferenceTarget {
17    Named(String),
18    Number(u32),
19    Relative(i32),
20}
21
22impl Reference {
23    pub(crate) fn new(target: ReferenceTarget, span: Span) -> Self {
24        Reference { target, span }
25    }
26
27    #[cfg(feature = "dbg")]
28    pub(super) fn pretty_print(&self, buf: &mut crate::PrettyPrinter) {
29        buf.push_str("::");
30        match &self.target {
31            ReferenceTarget::Named(n) => buf.write(n),
32            ReferenceTarget::Number(i) => buf.write_fmt(i),
33            &ReferenceTarget::Relative(o) => {
34                if o >= 0 {
35                    buf.push('+');
36                }
37                buf.write_fmt(o);
38            }
39        }
40    }
41}
42
43#[cfg(feature = "arbitrary")]
44impl arbitrary::Arbitrary<'_> for ReferenceTarget {
45    fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
46        Ok(match u.int_in_range(0u8..=2)? {
47            0 => ReferenceTarget::Named(super::arbitrary::Ident::create(u)?),
48            1 => ReferenceTarget::Number(u.int_in_range(0u8..=15)? as u32),
49            _ => ReferenceTarget::Relative(u.int_in_range(-15i8..=15)? as i32),
50        })
51    }
52
53    fn size_hint(depth: usize) -> (usize, Option<usize>) {
54        arbitrary::size_hint::and(super::arbitrary::Ident::size_hint(depth), (3, Some(3)))
55    }
56}