From 468726178fa572c165467ae0f6f46d7df640bd1b Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 26 Jun 2025 14:08:33 +0200 Subject: [PATCH] Bring back the firewall query --- crates/hir-def/src/lib.rs | 16 ++++++++-------- crates/hir-def/src/signatures.rs | 20 +++++++++++++------- crates/hir-ty/src/tests/incremental.rs | 1 + 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs index 8117b0206b18..bdf8b453e2d6 100644 --- a/crates/hir-def/src/lib.rs +++ b/crates/hir-def/src/lib.rs @@ -257,13 +257,13 @@ impl_intern!(StructId, StructLoc, intern_struct, lookup_intern_struct); impl StructId { pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields { - &VariantFields::query(db, self.into()).0 + VariantFields::firewall(db, self.into()) } pub fn fields_with_source_map( self, db: &dyn DefDatabase, - ) -> &(VariantFields, Arc) { + ) -> (Arc, Arc) { VariantFields::query(db, self.into()) } } @@ -273,13 +273,13 @@ impl_intern!(UnionId, UnionLoc, intern_union, lookup_intern_union); impl UnionId { pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields { - &VariantFields::query(db, self.into()).0 + VariantFields::firewall(db, self.into()) } pub fn fields_with_source_map( self, db: &dyn DefDatabase, - ) -> &(VariantFields, Arc) { + ) -> (Arc, Arc) { VariantFields::query(db, self.into()) } } @@ -367,13 +367,13 @@ impl_loc!(EnumVariantLoc, id: Variant, parent: EnumId); impl EnumVariantId { pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields { - &VariantFields::query(db, self.into()).0 + VariantFields::firewall(db, self.into()) } pub fn fields_with_source_map( self, db: &dyn DefDatabase, - ) -> &(VariantFields, Arc) { + ) -> (Arc, Arc) { VariantFields::query(db, self.into()) } } @@ -1066,13 +1066,13 @@ impl_from!(EnumVariantId, StructId, UnionId for VariantId); impl VariantId { pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields { - &VariantFields::query(db, self).0 + VariantFields::firewall(db, self) } pub fn fields_with_source_map( self, db: &dyn DefDatabase, - ) -> &(VariantFields, Arc) { + ) -> (Arc, Arc) { VariantFields::query(db, self) } diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs index 6e924d93a24a..1958eb6c6a18 100644 --- a/crates/hir-def/src/signatures.rs +++ b/crates/hir-def/src/signatures.rs @@ -734,11 +734,11 @@ pub struct VariantFields { #[salsa::tracked] impl VariantFields { - #[salsa::tracked(returns(ref))] + #[salsa::tracked(returns(clone))] pub(crate) fn query( db: &dyn DefDatabase, id: VariantId, - ) -> (Self, Arc) { + ) -> (Arc, Arc) { let (shape, result) = match id { VariantId::EnumVariantId(id) => { let loc = id.lookup(db); @@ -775,19 +775,25 @@ impl VariantFields { } }; match result { - Some((fields, store, source_map)) => { - (VariantFields { fields, store: Arc::new(store), shape }, Arc::new(source_map)) - } + Some((fields, store, source_map)) => ( + Arc::new(VariantFields { fields, store: Arc::new(store), shape }), + Arc::new(source_map), + ), None => ( - VariantFields { + Arc::new(VariantFields { fields: Arena::default(), store: ExpressionStore::empty_singleton(), shape, - }, + }), ExpressionStoreSourceMap::empty_singleton(), ), } } + + #[salsa::tracked(returns(deref))] + pub(crate) fn firewall(db: &dyn DefDatabase, id: VariantId) -> Arc { + Self::query(db, id).0 + } } impl VariantFields { diff --git a/crates/hir-ty/src/tests/incremental.rs b/crates/hir-ty/src/tests/incremental.rs index 0262390651e1..0377ce95f190 100644 --- a/crates/hir-ty/src/tests/incremental.rs +++ b/crates/hir-ty/src/tests/incremental.rs @@ -596,6 +596,7 @@ fn main() { "struct_signature_with_source_map_shim", "generic_predicates_shim", "value_ty_shim", + "firewall_", "query_", "lang_item", "inherent_impls_in_crate_shim",