From 30980396afa713a7b877c7962c5b45329230cdc5 Mon Sep 17 00:00:00 2001 From: cynecx Date: Sat, 20 Mar 2021 18:29:30 +0100 Subject: hir_ty: add field_visibilities and fn_visibility queries --- crates/hir_ty/src/db.rs | 10 ++++++++-- crates/hir_ty/src/lower.rs | 27 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/db.rs b/crates/hir_ty/src/db.rs index 91a2e0b5b..b1d22a9f9 100644 --- a/crates/hir_ty/src/db.rs +++ b/crates/hir_ty/src/db.rs @@ -4,8 +4,8 @@ use std::sync::Arc; use base_db::{impl_intern_key, salsa, CrateId, Upcast}; use hir_def::{ - db::DefDatabase, expr::ExprId, ConstParamId, DefWithBodyId, FunctionId, GenericDefId, ImplId, - LocalFieldId, TypeParamId, VariantId, + db::DefDatabase, expr::ExprId, visibility::Visibility, ConstParamId, DefWithBodyId, FunctionId, + GenericDefId, ImplId, LocalFieldId, TypeParamId, VariantId, }; use la_arena::ArenaMap; @@ -128,6 +128,12 @@ pub trait HirDatabase: DefDatabase + Upcast { krate: CrateId, env: chalk_ir::Environment, ) -> chalk_ir::ProgramClauses; + + #[salsa::invoke(crate::lower::field_visibilities_query)] + fn field_visibilities(&self, var: VariantId) -> Arc>; + + #[salsa::invoke(crate::lower::fn_visibility_query)] + fn fn_visibility(&self, def: FunctionId) -> Visibility; } fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc { diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index cbbb535e5..c4062a41d 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs @@ -16,9 +16,10 @@ use hir_def::{ path::{GenericArg, Path, PathSegment, PathSegments}, resolver::{HasResolver, Resolver, TypeNs}, type_ref::{TypeBound, TypeRef}, + visibility::Visibility, AdtId, AssocContainerId, AssocItemId, ConstId, ConstParamId, EnumId, EnumVariantId, FunctionId, - GenericDefId, HasModule, ImplId, LocalFieldId, Lookup, StaticId, StructId, TraitId, - TypeAliasId, TypeParamId, UnionId, VariantId, + GenericDefId, HasModule, ImplId, LocalFieldId, Lookup, ModuleDefId, StaticId, StructId, + TraitId, TypeAliasId, TypeParamId, UnionId, VariantId, }; use hir_expand::name::Name; use la_arena::ArenaMap; @@ -867,6 +868,28 @@ pub(crate) fn field_types_query( Arc::new(res) } +/// Resolve visibility of all specific fields of a struct or union variant. +pub(crate) fn field_visibilities_query( + db: &dyn HirDatabase, + variant_id: VariantId, +) -> Arc> { + let def_db = db.upcast(); + let var_data = variant_data(def_db, variant_id); + let resolver = variant_id.module(def_db).resolver(def_db); + let mut res = ArenaMap::default(); + for (field_id, field_data) in var_data.fields().iter() { + res.insert(field_id, field_data.visibility.resolve(def_db, &resolver)) + } + Arc::new(res) +} + +/// Resolve visibility of a function. +pub(crate) fn fn_visibility_query(db: &dyn HirDatabase, def: FunctionId) -> Visibility { + let def_db = db.upcast(); + let resolver = ModuleDefId::from(def).module(def_db).unwrap().resolver(def_db); + db.function_data(def).visibility.resolve(def_db, &resolver) +} + /// This query exists only to be used when resolving short-hand associated types /// like `T::Item`. /// -- cgit v1.2.3