]> git.lizzy.rs Git - rust.git/commitdiff
New definition_visibility method
authorFedor Sakharov <fedor.sakharov@gmail.com>
Mon, 11 May 2020 11:28:14 +0000 (14:28 +0300)
committerFedor Sakharov <fedor.sakharov@gmail.com>
Mon, 11 May 2020 11:28:14 +0000 (14:28 +0300)
crates/ra_hir/src/code_model.rs
crates/ra_ide_db/src/defs.rs

index be18c845c643d7a8dcf2c0b346a1e84e913ef1d8..cb91bd965e4a8062e85a0162eb60204181a12771 100644 (file)
@@ -148,6 +148,26 @@ pub fn module(self, db: &dyn HirDatabase) -> Option<Module> {
             ModuleDef::BuiltinType(_) => None,
         }
     }
+
+    pub fn definition_visibility(&self, db: &dyn HirDatabase) -> Option<Visibility> {
+        let module = match self {
+            ModuleDef::Module(it) => it.parent(db)?,
+            ModuleDef::Function(it) => return Some(it.visibility(db)),
+            ModuleDef::Adt(it) => it.module(db),
+            ModuleDef::EnumVariant(it) => {
+                let parent = it.parent_enum(db);
+                let module = it.module(db);
+                return module.visibility_of(db, &ModuleDef::Adt(Adt::Enum(parent)));
+            }
+            ModuleDef::Const(it) => return Some(it.visibility(db)),
+            ModuleDef::Static(it) => it.module(db),
+            ModuleDef::Trait(it) => it.module(db),
+            ModuleDef::TypeAlias(it) => return Some(it.visibility(db)),
+            ModuleDef::BuiltinType(_) => return None,
+        };
+
+        module.visibility_of(db, self)
+    }
 }
 
 pub use hir_def::{
index bddfef2407d5e36d9cb7e8858398471b59362164..60c11178eea63b3f1025596da654d6501938e496 100644 (file)
@@ -6,7 +6,7 @@
 // FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
 
 use hir::{
-    Adt, Field, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
+    Field, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
     Semantics, TypeParam, Visibility,
 };
 use ra_prof::profile;
@@ -42,21 +42,10 @@ pub fn module(&self, db: &RootDatabase) -> Option<Module> {
     }
 
     pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
-        let module = self.module(db);
-
         match self {
             Definition::Macro(_) => None,
             Definition::Field(sf) => Some(sf.visibility(db)),
-            Definition::ModuleDef(def) => match def {
-                ModuleDef::EnumVariant(id) => {
-                    let parent = id.parent_enum(db);
-                    module?.visibility_of(db, &ModuleDef::Adt(Adt::Enum(parent)))
-                }
-                ModuleDef::Function(f) => Some(f.visibility(db)),
-                ModuleDef::Const(c) => Some(c.visibility(db)),
-                ModuleDef::TypeAlias(t) => Some(t.visibility(db)),
-                _ => module?.visibility_of(db, def),
-            },
+            Definition::ModuleDef(def) => def.definition_visibility(db),
             Definition::SelfType(_) => None,
             Definition::Local(_) => None,
             Definition::TypeParam(_) => None,