aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/visibility.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/visibility.rs')
-rw-r--r--crates/hir_def/src/visibility.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/crates/hir_def/src/visibility.rs b/crates/hir_def/src/visibility.rs
index 0e3951910..7d00a37c4 100644
--- a/crates/hir_def/src/visibility.rs
+++ b/crates/hir_def/src/visibility.rs
@@ -1,13 +1,17 @@
1//! Defines hir-level representation of visibility (e.g. `pub` and `pub(crate)`). 1//! Defines hir-level representation of visibility (e.g. `pub` and `pub(crate)`).
2 2
3use std::sync::Arc;
4
3use hir_expand::{hygiene::Hygiene, InFile}; 5use hir_expand::{hygiene::Hygiene, InFile};
6use la_arena::ArenaMap;
4use syntax::ast; 7use syntax::ast;
5 8
6use crate::{ 9use crate::{
7 db::DefDatabase, 10 db::DefDatabase,
8 nameres::DefMap, 11 nameres::DefMap,
9 path::{ModPath, PathKind}, 12 path::{ModPath, PathKind},
10 ModuleId, 13 resolver::HasResolver,
14 FunctionId, HasModule, LocalFieldId, ModuleDefId, ModuleId, VariantId,
11}; 15};
12 16
13/// Visibility of an item, not yet resolved. 17/// Visibility of an item, not yet resolved.
@@ -190,3 +194,29 @@ impl Visibility {
190 } 194 }
191 } 195 }
192} 196}
197
198/// Resolve visibility of all specific fields of a struct or union variant.
199pub(crate) fn field_visibilities_query(
200 db: &dyn DefDatabase,
201 variant_id: VariantId,
202) -> Arc<ArenaMap<LocalFieldId, Visibility>> {
203 let var_data = match variant_id {
204 VariantId::StructId(it) => db.struct_data(it).variant_data.clone(),
205 VariantId::UnionId(it) => db.union_data(it).variant_data.clone(),
206 VariantId::EnumVariantId(it) => {
207 db.enum_data(it.parent).variants[it.local_id].variant_data.clone()
208 }
209 };
210 let resolver = variant_id.module(db).resolver(db);
211 let mut res = ArenaMap::default();
212 for (field_id, field_data) in var_data.fields().iter() {
213 res.insert(field_id, field_data.visibility.resolve(db, &resolver))
214 }
215 Arc::new(res)
216}
217
218/// Resolve visibility of a function.
219pub(crate) fn function_visibility_query(db: &dyn DefDatabase, def: FunctionId) -> Visibility {
220 let resolver = ModuleDefId::from(def).module(db).unwrap().resolver(db);
221 db.function_data(def).visibility.resolve(db, &resolver)
222}