From 96c88680b2d680f42809f838e79213e087d1fa1c Mon Sep 17 00:00:00 2001 From: cynecx Date: Wed, 24 Mar 2021 22:59:59 +0100 Subject: hir_def: move visibility queries from hir_ty to hir_def --- crates/hir_def/src/visibility.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'crates/hir_def/src/visibility.rs') 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 @@ //! Defines hir-level representation of visibility (e.g. `pub` and `pub(crate)`). +use std::sync::Arc; + use hir_expand::{hygiene::Hygiene, InFile}; +use la_arena::ArenaMap; use syntax::ast; use crate::{ db::DefDatabase, nameres::DefMap, path::{ModPath, PathKind}, - ModuleId, + resolver::HasResolver, + FunctionId, HasModule, LocalFieldId, ModuleDefId, ModuleId, VariantId, }; /// Visibility of an item, not yet resolved. @@ -190,3 +194,29 @@ 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> { + let var_data = match variant_id { + VariantId::StructId(it) => db.struct_data(it).variant_data.clone(), + VariantId::UnionId(it) => db.union_data(it).variant_data.clone(), + VariantId::EnumVariantId(it) => { + db.enum_data(it.parent).variants[it.local_id].variant_data.clone() + } + }; + let resolver = variant_id.module(db).resolver(db); + let mut res = ArenaMap::default(); + for (field_id, field_data) in var_data.fields().iter() { + res.insert(field_id, field_data.visibility.resolve(db, &resolver)) + } + Arc::new(res) +} + +/// Resolve visibility of a function. +pub(crate) fn function_visibility_query(db: &dyn DefDatabase, def: FunctionId) -> Visibility { + let resolver = ModuleDefId::from(def).module(db).unwrap().resolver(db); + db.function_data(def).visibility.resolve(db, &resolver) +} -- cgit v1.2.3