about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <me@lukaswirth.dev>2025-06-26 14:08:33 +0200
committerLukas Wirth <me@lukaswirth.dev>2025-06-26 14:12:57 +0200
commite019a37aa86575e5baacdde73c8f1802c088cde1 (patch)
treef1b8f0bc9c0764a82a34797d3bd63352d2b3afba
parent919e8ef72b438e073a1ffacdb53626dc1991b591 (diff)
downloadrust-e019a37aa86575e5baacdde73c8f1802c088cde1.tar.gz
rust-e019a37aa86575e5baacdde73c8f1802c088cde1.zip
Bring back the firewall query
-rw-r--r--src/tools/rust-analyzer/crates/hir-def/src/lib.rs16
-rw-r--r--src/tools/rust-analyzer/crates/hir-def/src/signatures.rs20
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/tests/incremental.rs1
3 files changed, 22 insertions, 15 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-def/src/lib.rs b/src/tools/rust-analyzer/crates/hir-def/src/lib.rs
index 8117b0206b1..bdf8b453e2d 100644
--- a/src/tools/rust-analyzer/crates/hir-def/src/lib.rs
+++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/hir-def/src/signatures.rs b/src/tools/rust-analyzer/crates/hir-def/src/signatures.rs
index 6e924d93a24..1958eb6c6a1 100644
--- a/src/tools/rust-analyzer/crates/hir-def/src/signatures.rs
+++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/hir-ty/src/tests/incremental.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/incremental.rs
index 0262390651e..0377ce95f19 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/incremental.rs
+++ b/src/tools/rust-analyzer/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",