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}