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.rs45
1 files changed, 24 insertions, 21 deletions
diff --git a/crates/hir-def/src/visibility.rs b/crates/hir-def/src/visibility.rs
index a1645de6ec..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};
@@ -146,7 +146,7 @@ impl Visibility {
/// Returns the most permissive visibility of `self` and `other`.
///
- /// If there is no subset relation between `self` and `other`, returns `None` (ie. they're only
+ /// If there is no subset relation between `self` and `other`, returns `None` (i.e. they're only
/// visible in unrelated modules).
pub(crate) fn max(
self,
@@ -212,7 +212,7 @@ impl Visibility {
/// Returns the least permissive visibility of `self` and `other`.
///
- /// If there is no subset relation between `self` and `other`, returns `None` (ie. they're only
+ /// If there is no subset relation between `self` and `other`, returns `None` (i.e. they're only
/// visible in unrelated modules).
pub(crate) fn min(
self,
@@ -234,7 +234,7 @@ impl Visibility {
if mod_.krate(db) == krate { Some(Visibility::Module(mod_, exp)) } else { None }
}
(Visibility::Module(mod_a, expl_a), Visibility::Module(mod_b, expl_b)) => {
- if mod_a.krate(db) != mod_b.krate(db) {
+ if mod_a == mod_b {
// Most module visibilities are `pub(self)`, and assuming no errors
// this will be the common and thus fast path.
return Some(Visibility::Module(
@@ -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(