diff --git a/crates/hir-expand/src/db.rs b/crates/hir-expand/src/db.rs index 5c517e671be4..12773c74a87d 100644 --- a/crates/hir-expand/src/db.rs +++ b/crates/hir-expand/src/db.rs @@ -697,7 +697,7 @@ fn check_tt_count(tt: &tt::TopSubtree) -> Result<(), ExpandResult<()>> { } fn intern_macro_call(db: &dyn ExpandDatabase, macro_call: MacroCallLoc) -> MacroCallId { - MacroCallId::new(db, macro_call) + unsafe { crate::MacroCallIdLt::new(db, macro_call).to_static() } } fn lookup_intern_macro_call(db: &dyn ExpandDatabase, macro_call: MacroCallId) -> MacroCallLoc { diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs index c92e41f5070c..28d23e99de4e 100644 --- a/crates/hir-expand/src/lib.rs +++ b/crates/hir-expand/src/lib.rs @@ -1077,11 +1077,31 @@ impl ExpandTo { intern::impl_internable!(ModPath); -#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)] +#[salsa_macros::tracked(debug)] +#[derive(PartialOrd, Ord)] #[doc(alias = "MacroFileId")] -pub struct MacroCallId { +pub struct MacroCallIdLt<'id> { pub loc: MacroCallLoc, } +pub type MacroCallId = MacroCallIdLt<'static>; + +impl MacroCallIdLt<'_> { + /// # Safety + /// + /// The caller must ensure that the `MacroCallId` is not leaked outside of query computations. + pub unsafe fn to_static(self) -> MacroCallId { + unsafe { std::mem::transmute(self) } + } +} + +impl MacroCallId { + /// # Safety + /// + /// The caller must ensure that the `MacroCallId` comes from the given database. + pub unsafe fn to_db<'db>(self, _db: &'db dyn ExpandDatabase) -> MacroCallIdLt<'db> { + unsafe { std::mem::transmute(self) } + } +} impl From for MacroCallId { #[inline]