Skip to main content

macroonz_compiler/host/
type_guard.rs

1//! The host's invariant nucleus: every road that reaches the span custody's private seat.
2//!
3//! Declared inside `types.rs` as its own child, so the held spans are reachable here and nowhere else.
4//! Handles are issued in reading order and never reused, which is the whole invariant: a handle answers about the token it was issued for, or the table says it does not reach.
5
6use super::Spans;
7use crate::token::{CaptureBuilder, SpanHandle};
8use proc_macro::Span;
9
10impl Spans {
11    /// A table that has issued nothing.
12    #[must_use]
13    pub const fn empty() -> Self {
14        Self {
15            builder: CaptureBuilder::declared(),
16        }
17    }
18
19    /// The checked builder that owns this table's handles and positions.
20    pub(crate) const fn builder(&mut self) -> &mut CaptureBuilder<Span> {
21        &mut self.builder
22    }
23
24    /// The compiler span one handle names, or the invocation where this table does not reach it.
25    ///
26    /// One lookup for every road that holds a handle, so a diagnostic the compiler composed and a capture this host refused point at their token the same way.
27    /// Where the table does not reach, the invocation stands — never the declaration's first span, which is a real token the observation is not about and would read exactly like an answer.
28    #[must_use]
29    pub fn at(&self, handle: SpanHandle) -> Span {
30        match usize::try_from(handle.index())
31            .ok()
32            .and_then(|index| self.builder.positions().get(index).copied())
33        {
34            Some(span) => span,
35            None => Span::call_site(),
36        }
37    }
38}