Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/visibility.rs')
-rw-r--r--crates/hir-def/src/visibility.rs39
1 files changed, 21 insertions, 18 deletions
diff --git a/crates/hir-def/src/visibility.rs b/crates/hir-def/src/visibility.rs
index cb5eed1b8b..81a61ec20f 100644
--- a/crates/hir-def/src/visibility.rs
+++ b/crates/hir-def/src/visibility.rs
@@ -6,11 +6,11 @@ use base_db::Crate;
use hir_expand::{InFile, Lookup};
use la_arena::ArenaMap;
use syntax::ast::{self, HasVisibility};
-use triomphe::Arc;
use crate::{
AssocItemId, HasModule, ItemContainerId, LocalFieldId, ModuleId, TraitId, VariantId,
- db::DefDatabase, nameres::DefMap, resolver::HasResolver, src::HasSource,
+ db::DefDatabase, nameres::DefMap, resolver::HasResolver, signatures::VariantFields,
+ src::HasSource,
};
pub use crate::item_tree::{RawVisibility, VisibilityExplicitness};
@@ -277,23 +277,26 @@ impl Visibility {
}
}
-/// Resolve visibility of all specific fields of a struct or union variant.
-pub(crate) fn field_visibilities_query(
- db: &dyn DefDatabase,
- variant_id: VariantId,
-) -> Arc<ArenaMap<LocalFieldId, Visibility>> {
- let variant_fields = variant_id.fields(db);
- let fields = variant_fields.fields();
- if fields.is_empty() {
- return Arc::default();
- }
- let resolver = variant_id.module(db).resolver(db);
- let mut res = ArenaMap::default();
- for (field_id, field_data) in fields.iter() {
- res.insert(field_id, Visibility::resolve(db, &resolver, &field_data.visibility));
+#[salsa::tracked]
+impl VariantFields {
+ /// Resolve visibility of all specific fields of a struct or union variant.
+ #[salsa::tracked(returns(ref))]
+ pub fn field_visibilities(
+ db: &dyn DefDatabase,
+ variant_id: VariantId,
+ ) -> ArenaMap<LocalFieldId, Visibility> {
+ let variant_fields = variant_id.fields(db);
+ let fields = variant_fields.fields();
+ if fields.is_empty() {
+ return ArenaMap::default();
+ }
+ let resolver = variant_id.module(db).resolver(db);
+ let mut res = ArenaMap::with_capacity(fields.len());
+ for (field_id, field_data) in fields.iter() {
+ res.insert(field_id, Visibility::resolve(db, &resolver, &field_data.visibility));
+ }
+ res
}
- res.shrink_to_fit();
- Arc::new(res)
}
pub fn visibility_from_ast(