From ca15cf422cb83c9657ab1db8a8165f486e4b7cde Mon Sep 17 00:00:00 2001
From: Florian Diebold <flodiebold@gmail.com>
Date: Tue, 24 Dec 2019 21:45:58 +0100
Subject: Add visibility in code model for fields

---
 crates/ra_hir/src/code_model.rs | 19 ++++++++++++++++++-
 crates/ra_hir/src/lib.rs        |  4 ++--
 2 files changed, 20 insertions(+), 3 deletions(-)

(limited to 'crates')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 76d8f85f1..c5114742b 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -118,7 +118,7 @@ impl_froms!(
     BuiltinType
 );
 
-pub use hir_def::attr::Attrs;
+pub use hir_def::{attr::Attrs, visibility::ResolvedVisibility};
 
 impl Module {
     pub(crate) fn new(krate: Crate, crate_module_id: LocalModuleId) -> Module {
@@ -255,6 +255,15 @@ impl StructField {
     }
 }
 
+impl HasVisibility for StructField {
+    fn visibility(&self, db: &impl HirDatabase) -> ResolvedVisibility {
+        let struct_field_id: hir_def::StructFieldId = (*self).into();
+        let visibility = db.visibility(struct_field_id.into());
+        let parent_id: hir_def::VariantId = self.parent.into();
+        visibility.resolve(db, &parent_id.resolver(db))
+    }
+}
+
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct Struct {
     pub(crate) id: StructId,
@@ -1041,3 +1050,11 @@ impl<T: Into<AttrDef> + Copy> Docs for T {
         db.documentation(def.into())
     }
 }
+
+pub trait HasVisibility {
+    fn visibility(&self, db: &impl HirDatabase) -> ResolvedVisibility;
+    fn visible_from(&self, db: &impl HirDatabase, module: Module) -> bool {
+        let vis = self.visibility(db);
+        vis.visible_from(db, module.id)
+    }
+}
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 0008a8858..3d13978d4 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -40,8 +40,8 @@ mod from_source;
 pub use crate::{
     code_model::{
         Adt, AssocItem, AttrDef, Const, Crate, CrateDependency, DefWithBody, Docs, Enum,
-        EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Local, MacroDef,
-        Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias,
+        EnumVariant, FieldSource, Function, GenericDef, HasAttrs, HasVisibility, ImplBlock, Local,
+        MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias,
         TypeParam, Union, VariantDef,
     },
     from_source::FromSource,
-- 
cgit v1.2.3