use crate::interning::{Internable, Interned, InterningTable};
use hax_rust_engine_macros::*;
use std::sync::{LazyLock, Mutex};
fn fresh_id() -> u32 {
use std::sync::atomic::{AtomicU32 as AtomicInt, Ordering};
static CURRENT_ID: AtomicInt = AtomicInt::new(0);
CURRENT_ID.fetch_add(1, Ordering::Relaxed)
}
#[derive_group_for_ast]
struct SpanData {
data: Vec<hax_frontend_exporter::Span>,
owner_hint: Option<Interned<hax_frontend_exporter::DefId>>,
}
impl SpanData {
fn dummy() -> Self {
let lo: hax_frontend_exporter::Loc = hax_frontend_exporter::Loc { line: 0, col: 0 };
let hi = lo.clone();
SpanData {
data: vec![hax_frontend_exporter::Span {
lo,
hi,
filename: hax_frontend_exporter::FileName::Custom("dumny".into()),
rust_span_data: None,
}],
owner_hint: None,
}
}
fn from_exporter(
span: hax_frontend_exporter::Span,
owner_hint: Option<&hax_frontend_exporter::DefId>,
) -> Self {
Self {
data: vec![span],
owner_hint: owner_hint.map(Interned::intern),
}
}
}
#[derive_group_for_ast]
#[derive(Copy)]
pub struct Span {
#[serde(flatten)]
data: Interned<SpanData>,
id: u32,
}
impl Internable for SpanData {
fn interning_table() -> &'static Mutex<InterningTable<Self>> {
static TABLE: LazyLock<Mutex<InterningTable<SpanData>>> =
LazyLock::new(|| Mutex::new(InterningTable::default()));
&TABLE
}
}
impl Span {
pub fn dummy() -> Self {
static DUMMY_SPAN: LazyLock<Span> = LazyLock::new(|| {
let data = Interned::intern(&SpanData::dummy());
Span {
data,
id: fresh_id(),
}
});
*DUMMY_SPAN
}
pub fn from_exporter(
span: hax_frontend_exporter::Span,
owner_hint: Option<&hax_frontend_exporter::DefId>,
) -> Self {
let data = Interned::intern(&SpanData::from_exporter(span, owner_hint));
Self {
data,
id: fresh_id(),
}
}
pub fn as_frontend_spans(self) -> &'static [hax_frontend_exporter::Span] {
&self.data.get().data
}
}
impl Internable for hax_frontend_exporter::DefId {
fn interning_table() -> &'static Mutex<InterningTable<Self>> {
static TABLE: LazyLock<Mutex<InterningTable<hax_frontend_exporter::DefId>>> =
LazyLock::new(|| Mutex::new(InterningTable::default()));
&TABLE
}
}