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(Clone, Copy, PartialEq, Eq)]
9pub struct Reference<'i> {
10    pub target: ReferenceTarget<'i>,
11    pub span: Span,
12}
13
14#[derive(Clone, Copy, PartialEq, Eq)]
15pub enum ReferenceTarget<'i> {
16    Named(&'i str),
17    Number(u32),
18    Relative(i32),
19}
20
21impl<'i> Reference<'i> {
22    pub(crate) fn new(target: ReferenceTarget<'i>, span: Span) -> Self {
23        Reference { target, span }
24    }
25
26    #[cfg(feature = "dbg")]
27    pub(super) fn pretty_print(&self, buf: &mut crate::PrettyPrinter) {
28        buf.push_str("::");
29        match self.target {
30            ReferenceTarget::Named(n) => buf.write(n),
31            ReferenceTarget::Number(i) => buf.write_fmt(i),
32            ReferenceTarget::Relative(o) => {
33                buf.push(if o < 0 { '-' } else { '+' });
34                buf.write_fmt(o);
35            }
36        }
37    }
38}