mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Add ItemScope::visibility_of
This commit is contained in:
parent
7c2cc85806
commit
bcfb3700ce
4 changed files with 19 additions and 24 deletions
|
@ -234,6 +234,10 @@ impl Module {
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn visibility_of(self, db: &dyn HirDatabase, def: &ModuleDef) -> Option<Visibility> {
|
||||||
|
db.crate_def_map(self.id.krate)[self.id.local_id].scope.visbility_of(def.clone().into())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) {
|
pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) {
|
||||||
let _p = profile("Module::diagnostics");
|
let _p = profile("Module::diagnostics");
|
||||||
let crate_def_map = db.crate_def_map(self.id.krate);
|
let crate_def_map = db.crate_def_map(self.id.krate);
|
||||||
|
|
|
@ -54,7 +54,7 @@ pub use crate::{
|
||||||
Adt, AsAssocItem, AssocItem, AssocItemContainer, AttrDef, Const, Crate, CrateDependency,
|
Adt, AsAssocItem, AssocItem, AssocItemContainer, AttrDef, Const, Crate, CrateDependency,
|
||||||
DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs,
|
DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs,
|
||||||
HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct,
|
HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct,
|
||||||
StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef,
|
StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, Visibility,
|
||||||
},
|
},
|
||||||
has_source::HasSource,
|
has_source::HasSource,
|
||||||
semantics::{original_range, PathResolution, Semantics, SemanticsScope},
|
semantics::{original_range, PathResolution, Semantics, SemanticsScope},
|
||||||
|
|
|
@ -68,6 +68,12 @@ impl ItemScope {
|
||||||
self.impls.iter().copied()
|
self.impls.iter().copied()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn visbility_of(&self, def: ModuleDefId) -> Option<Visibility> {
|
||||||
|
self.name_of(ItemInNs::Types(def))
|
||||||
|
.or_else(|| self.name_of(ItemInNs::Values(def)))
|
||||||
|
.map(|(_, v)| v)
|
||||||
|
}
|
||||||
|
|
||||||
/// Iterate over all module scoped macros
|
/// Iterate over all module scoped macros
|
||||||
pub(crate) fn macros<'a>(&'a self) -> impl Iterator<Item = (&'a Name, MacroDefId)> + 'a {
|
pub(crate) fn macros<'a>(&'a self) -> impl Iterator<Item = (&'a Name, MacroDefId)> + 'a {
|
||||||
self.visible.iter().filter_map(|(name, def)| def.take_macros().map(|macro_| (name, macro_)))
|
self.visible.iter().filter_map(|(name, def)| def.take_macros().map(|macro_| (name, macro_)))
|
||||||
|
|
|
@ -6,12 +6,12 @@
|
||||||
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
|
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
|
||||||
|
|
||||||
use hir::{
|
use hir::{
|
||||||
Adt, FieldSource, HasSource, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
|
HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution, Semantics,
|
||||||
Semantics, StructField, TypeParam,
|
StructField, TypeParam, Visibility,
|
||||||
};
|
};
|
||||||
use ra_prof::profile;
|
use ra_prof::profile;
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
ast::{self, AstNode, VisibilityOwner},
|
ast::{self, AstNode},
|
||||||
match_ast,
|
match_ast,
|
||||||
};
|
};
|
||||||
use test_utils::tested_by;
|
use test_utils::tested_by;
|
||||||
|
@ -41,28 +41,13 @@ impl Definition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn visibility(&self, db: &RootDatabase) -> Option<ast::Visibility> {
|
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
|
||||||
|
let module = self.module(db);
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
Definition::Macro(_) => None,
|
Definition::Macro(_) => None,
|
||||||
Definition::StructField(sf) => match sf.source(db).value {
|
Definition::StructField(sf) => Some(sf.visibility(db)),
|
||||||
FieldSource::Named(it) => it.visibility(),
|
Definition::ModuleDef(def) => module?.visibility_of(db, def),
|
||||||
FieldSource::Pos(it) => it.visibility(),
|
|
||||||
},
|
|
||||||
Definition::ModuleDef(def) => match def {
|
|
||||||
ModuleDef::Module(it) => it.declaration_source(db)?.value.visibility(),
|
|
||||||
ModuleDef::Function(it) => it.source(db).value.visibility(),
|
|
||||||
ModuleDef::Adt(adt) => match adt {
|
|
||||||
Adt::Struct(it) => it.source(db).value.visibility(),
|
|
||||||
Adt::Union(it) => it.source(db).value.visibility(),
|
|
||||||
Adt::Enum(it) => it.source(db).value.visibility(),
|
|
||||||
},
|
|
||||||
ModuleDef::Const(it) => it.source(db).value.visibility(),
|
|
||||||
ModuleDef::Static(it) => it.source(db).value.visibility(),
|
|
||||||
ModuleDef::Trait(it) => it.source(db).value.visibility(),
|
|
||||||
ModuleDef::TypeAlias(it) => it.source(db).value.visibility(),
|
|
||||||
ModuleDef::EnumVariant(_) => None,
|
|
||||||
ModuleDef::BuiltinType(_) => None,
|
|
||||||
},
|
|
||||||
Definition::SelfType(_) => None,
|
Definition::SelfType(_) => None,
|
||||||
Definition::Local(_) => None,
|
Definition::Local(_) => None,
|
||||||
Definition::TypeParam(_) => None,
|
Definition::TypeParam(_) => None,
|
||||||
|
|
Loading…
Reference in a new issue