pomsky_syntax/exprs/
reference.rs1use 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}