Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/hir-def/src/lib.rs | 16 | ||||
| -rw-r--r-- | crates/hir-def/src/signatures.rs | 20 | ||||
| -rw-r--r-- | 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 8117b0206b..bdf8b453e2 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<ExpressionStoreSourceMap>) { + ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) { 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<ExpressionStoreSourceMap>) { + ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) { 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<ExpressionStoreSourceMap>) { + ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) { 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<ExpressionStoreSourceMap>) { + ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) { VariantFields::query(db, self) } diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs index 6e924d93a2..1958eb6c6a 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<ExpressionStoreSourceMap>) { + ) -> (Arc<Self>, Arc<ExpressionStoreSourceMap>) { 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> { + 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 0262390651..0377ce95f1 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", |