]> git.lizzy.rs Git - rust.git/commitdiff
hir_ty: add field_visibilities and fn_visibility queries
authorcynecx <me@cynecx.net>
Sat, 20 Mar 2021 17:29:30 +0000 (18:29 +0100)
committercynecx <me@cynecx.net>
Sat, 20 Mar 2021 17:29:30 +0000 (18:29 +0100)
crates/hir_ty/src/db.rs
crates/hir_ty/src/lower.rs

index 91a2e0b5be92e7a11b0fcf7969c27ac1eb49e257..b1d22a9f90f10cbf76254334caf040ed5b0b9262 100644 (file)
@@ -4,8 +4,8 @@
 
 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 @@ fn program_clauses_for_chalk_env(
         krate: CrateId,
         env: chalk_ir::Environment<chalk::Interner>,
     ) -> chalk_ir::ProgramClauses<chalk::Interner>;
+
+    #[salsa::invoke(crate::lower::field_visibilities_query)]
+    fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
+
+    #[salsa::invoke(crate::lower::fn_visibility_query)]
+    fn fn_visibility(&self, def: FunctionId) -> Visibility;
 }
 
 fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
index cbbb535e554b2442fac14c41d57dab3b26fe87b5..c4062a41daa434a5775c5b2c82297023112a803e 100644 (file)
     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<ArenaMap<LocalFieldId, Visibility>> {
+    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`.
 ///