use std::{
path::PathBuf,
sync::atomic::{AtomicUsize, Ordering},
};
use prebindgen::SourceLocation;
use crate::registry::{Registry, RegistryBuilder};
pub(crate) fn reg_with<M>(sources: &[&str]) -> RegistryBuilder<M> {
let items = sources
.iter()
.map(|src| {
let item: syn::Item = syn::parse_str(src).expect("parse item");
(item, SourceLocation::default())
})
.collect::<Vec<_>>();
reg_from_items(declare_referenced(items)).expect("index")
}
pub(crate) fn scanned_with<M>(sources: &[&str]) -> Registry<M> {
reg_with(sources).scanned().expect("scan")
}
pub(crate) fn declared_origin(ty: syn::Type) -> prebindgen_flat::flat::Origin<syn::Type> {
prebindgen_flat::flat::Origin::new(ty, std::rc::Rc::new(SourceLocation::default()))
}
pub(crate) fn reg_from_items<M, I>(items: I) -> Result<RegistryBuilder<M>, crate::ScanError>
where
I: IntoIterator<Item = (syn::Item, SourceLocation)>,
{
let flat = prebindgen_flat::Flat::builder().items(items).build()?;
Registry::builder(flat)
}
pub(crate) fn declare_referenced<I>(items: I) -> Vec<(syn::Item, SourceLocation)>
where
I: IntoIterator<Item = (syn::Item, SourceLocation)>,
{
use prebindgen_flat::flat::{Flat, ItemError};
let mut items: Vec<(syn::Item, SourceLocation)> = items.into_iter().collect();
loop {
let flat = Flat::builder()
.items(items.iter().cloned())
.build()
.expect("fixture parses");
let missing: std::collections::BTreeSet<String> = flat
.unsupported()
.filter_map(|u| match &*u.error {
ItemError::UnresolvedType { name }
if !name.contains("::") && flat.element(name).is_none() =>
{
Some(name.clone())
}
_ => None,
})
.collect();
if missing.is_empty() {
return items;
}
for name in missing {
let ident = quote::format_ident!("{name}");
let alias: syn::Item = syn::parse_quote!(
pub type #ident = __fixture::#ident;
);
items.push((alias, SourceLocation::default()));
}
}
}
pub(crate) fn unique_test_dir(prefix: &str) -> PathBuf {
static SEQ: AtomicUsize = AtomicUsize::new(0);
let seq = SEQ.fetch_add(1, Ordering::Relaxed);
std::env::temp_dir().join(format!("{prefix}_{}_{}", std::process::id(), seq))
}