Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/lib.rs16
-rw-r--r--crates/hir-def/src/signatures.rs20
-rw-r--r--crates/hir-ty/src/tests/incremental.rs1
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",