From bceeb6a3c74bb90593770b4a6b6de39f0b097a49 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 15 Jun 2025 09:43:42 +0200 Subject: [PATCH] Idiomatic salsa use for extern block abi query --- crates/hir-def/src/db.rs | 5 +---- crates/hir-def/src/lib.rs | 10 +++++++++- crates/hir-def/src/signatures.rs | 2 +- crates/hir-ty/src/mir/eval/shim.rs | 6 ++---- crates/hir-ty/src/tests/incremental.rs | 4 ++-- crates/hir-ty/src/utils.rs | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs index 05fba1f7a1..f5ade8bc6f 100644 --- a/crates/hir-def/src/db.rs +++ b/crates/hir-def/src/db.rs @@ -5,7 +5,7 @@ use hir_expand::{ EditionedFileId, HirFileId, InFile, Lookup, MacroCallId, MacroDefId, MacroDefKind, db::ExpandDatabase, }; -use intern::{Symbol, sym}; +use intern::sym; use la_arena::ArenaMap; use syntax::{AstPtr, ast}; use triomphe::Arc; @@ -238,9 +238,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase { e: TypeAliasId, ) -> (Arc, Arc); - #[salsa::invoke(crate::signatures::extern_block_abi_query)] - fn extern_block_abi(&self, extern_block: ExternBlockId) -> Option; - // endregion:data #[salsa::invoke(Body::body_with_source_map_query)] diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs index ed602d5198..68f0a4b26e 100644 --- a/crates/hir-def/src/lib.rs +++ b/crates/hir-def/src/lib.rs @@ -49,7 +49,7 @@ pub mod find_path; pub mod import_map; pub mod visibility; -use intern::{Interned, sym}; +use intern::{Interned, Symbol, sym}; pub use rustc_abi as layout; use thin_vec::ThinVec; use triomphe::Arc; @@ -311,6 +311,14 @@ impl_intern!(ExternCrateId, ExternCrateLoc, intern_extern_crate, lookup_intern_e type ExternBlockLoc = ItemLoc; impl_intern!(ExternBlockId, ExternBlockLoc, intern_extern_block, lookup_intern_extern_block); +#[salsa::tracked] +impl ExternBlockId { + #[salsa::tracked] + pub fn abi(self, db: &dyn DefDatabase) -> Option { + signatures::extern_block_abi(db, self) + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EnumVariantLoc { pub id: AstId, diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs index c808079011..377a545ebf 100644 --- a/crates/hir-def/src/signatures.rs +++ b/crates/hir-def/src/signatures.rs @@ -965,7 +965,7 @@ impl EnumVariants { } } -pub(crate) fn extern_block_abi_query( +pub(crate) fn extern_block_abi( db: &dyn DefDatabase, extern_block: ExternBlockId, ) -> Option { diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs index 8d428dd6d0..6ebde01334 100644 --- a/crates/hir-ty/src/mir/eval/shim.rs +++ b/crates/hir-ty/src/mir/eval/shim.rs @@ -65,7 +65,7 @@ impl Evaluator<'_> { Some(abi) => *abi == sym::rust_dash_intrinsic, None => match def.lookup(self.db).container { hir_def::ItemContainerId::ExternBlockId(block) => { - self.db.extern_block_abi(block) == Some(sym::rust_dash_intrinsic) + block.abi(self.db) == Some(sym::rust_dash_intrinsic) } _ => false, }, @@ -84,9 +84,7 @@ impl Evaluator<'_> { ); } let is_extern_c = match def.lookup(self.db).container { - hir_def::ItemContainerId::ExternBlockId(block) => { - self.db.extern_block_abi(block) == Some(sym::C) - } + hir_def::ItemContainerId::ExternBlockId(block) => block.abi(self.db) == Some(sym::C), _ => false, }; if is_extern_c { diff --git a/crates/hir-ty/src/tests/incremental.rs b/crates/hir-ty/src/tests/incremental.rs index b45d8babd4..905fd8a3bc 100644 --- a/crates/hir-ty/src/tests/incremental.rs +++ b/crates/hir-ty/src/tests/incremental.rs @@ -571,7 +571,7 @@ fn main() { "body_shim", "body_with_source_map_shim", "attrs_shim", - "impl_items_with_diagnostics_shim", + "of_", "infer_shim", "trait_signature_shim", "trait_signature_with_source_map_shim", @@ -678,7 +678,7 @@ fn main() { "body_with_source_map_shim", "attrs_shim", "body_shim", - "impl_items_with_diagnostics_shim", + "of_", "infer_shim", "attrs_shim", "trait_signature_with_source_map_shim", diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs index 867c7ea087..4c8e635eff 100644 --- a/crates/hir-ty/src/utils.rs +++ b/crates/hir-ty/src/utils.rs @@ -293,7 +293,7 @@ pub fn is_fn_unsafe_to_call( let loc = func.lookup(db); match loc.container { hir_def::ItemContainerId::ExternBlockId(block) => { - let is_intrinsic_block = db.extern_block_abi(block) == Some(sym::rust_dash_intrinsic); + let is_intrinsic_block = block.abi(db) == Some(sym::rust_dash_intrinsic); if is_intrinsic_block { // legacy intrinsics // extern "rust-intrinsic" intrinsics are unsafe unless they have the rustc_safe_intrinsic attribute