From d480a7d077c321df0055c5d7179ef14b0c4f6e67 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 7 Dec 2025 09:56:57 +0100 Subject: [PATCH] internal: Make `MacroCallId` a tracked struct instead of an interned --- crates/hir-expand/src/db.rs | 2 +- crates/hir-expand/src/lib.rs | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) 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]