use hermes_ast::SemaId;
macro_rules! declare_sema_id {
($(#[$doc:meta])* $name:ident) => {
$(#[$doc])*
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct $name(u32);
impl $name {
pub fn from_sema_id(id: SemaId) -> Self {
$name(id.0)
}
pub fn sema_id(self) -> SemaId {
SemaId(self.0)
}
pub fn index(self) -> usize {
self.0 as usize
}
}
};
}
declare_sema_id!(
DeclId
);
declare_sema_id!(
ScopeId
);
declare_sema_id!(
FunctionInfoId
);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decl_id_round_trips_through_sema_id() {
let decl = DeclId::from_sema_id(SemaId(7));
let sema = decl.sema_id();
assert_eq!(sema, SemaId(7));
let back = DeclId::from_sema_id(sema);
assert_eq!(back, decl);
assert_eq!(back.index(), 7);
}
#[test]
fn scope_id_round_trips_through_sema_id() {
let scope = ScopeId::from_sema_id(SemaId(3));
assert_eq!(scope.sema_id(), SemaId(3));
assert_eq!(scope.index(), 3);
}
#[test]
fn function_info_id_round_trips_through_sema_id() {
let f = FunctionInfoId::from_sema_id(SemaId(42));
assert_eq!(f.sema_id(), SemaId(42));
assert_eq!(f.index(), 42);
}
#[test]
fn ids_are_copy_eq_hash_debug() {
use std::collections::HashSet;
let a = DeclId::from_sema_id(SemaId(1));
let b = a; let mut set = HashSet::new();
set.insert(a);
assert!(set.contains(&b));
assert_eq!(format!("{a:?}"), format!("{b:?}"));
}
}