diff options
author | cynecx <[email protected]> | 2021-03-24 21:59:59 +0000 |
---|---|---|
committer | cynecx <[email protected]> | 2021-03-24 22:00:03 +0000 |
commit | 96c88680b2d680f42809f838e79213e087d1fa1c (patch) | |
tree | 95f172cd93c206914c891f912f4105ac1b466621 /crates/hir_def/src/visibility.rs | |
parent | 42abfa0f885834c3c2bf61a4d0fafaa3f570debd (diff) |
hir_def: move visibility queries from hir_ty to hir_def
Diffstat (limited to 'crates/hir_def/src/visibility.rs')
-rw-r--r-- | crates/hir_def/src/visibility.rs | 32 |
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 | ||
3 | use std::sync::Arc; | ||
4 | |||
3 | use hir_expand::{hygiene::Hygiene, InFile}; | 5 | use hir_expand::{hygiene::Hygiene, InFile}; |
6 | use la_arena::ArenaMap; | ||
4 | use syntax::ast; | 7 | use syntax::ast; |
5 | 8 | ||
6 | use crate::{ | 9 | use 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. | ||
199 | pub(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. | ||
219 | pub(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 | } | ||