aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r--crates/ra_hir/src/code_model.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 9685d6982..78c444037 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -207,10 +207,26 @@ impl Module {
207 } 207 }
208 208
209 /// Returns a `ModuleScope`: a set of items, visible in this module. 209 /// Returns a `ModuleScope`: a set of items, visible in this module.
210 pub fn scope(self, db: &impl HirDatabase) -> Vec<(Name, ScopeDef)> { 210 pub fn scope(
211 self,
212 db: &impl HirDatabase,
213 visible_from: Option<Module>,
214 ) -> Vec<(Name, ScopeDef)> {
211 db.crate_def_map(self.id.krate)[self.id.local_id] 215 db.crate_def_map(self.id.krate)[self.id.local_id]
212 .scope 216 .scope
213 .entries() 217 .entries()
218 .filter_map(|(name, def)| {
219 if let Some(m) = visible_from {
220 let filtered = def.filter_visibility(|vis| vis.is_visible_from(db, m.id));
221 if filtered.is_none() && !def.is_none() {
222 None
223 } else {
224 Some((name, filtered))
225 }
226 } else {
227 Some((name, def))
228 }
229 })
214 .map(|(name, def)| (name.clone(), def.into())) 230 .map(|(name, def)| (name.clone(), def.into()))
215 .collect() 231 .collect()
216 } 232 }
@@ -598,6 +614,14 @@ impl Function {
598 } 614 }
599} 615}
600 616
617impl HasVisibility for Function {
618 fn visibility(&self, db: &impl HirDatabase) -> Visibility {
619 let function_data = db.function_data(self.id);
620 let visibility = &function_data.visibility;
621 visibility.resolve(db, &self.id.resolver(db))
622 }
623}
624
601#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 625#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
602pub struct Const { 626pub struct Const {
603 pub(crate) id: ConstId, 627 pub(crate) id: ConstId,
@@ -617,6 +641,14 @@ impl Const {
617 } 641 }
618} 642}
619 643
644impl HasVisibility for Const {
645 fn visibility(&self, db: &impl HirDatabase) -> Visibility {
646 let function_data = db.const_data(self.id);
647 let visibility = &function_data.visibility;
648 visibility.resolve(db, &self.id.resolver(db))
649 }
650}
651
620#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 652#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
621pub struct Static { 653pub struct Static {
622 pub(crate) id: StaticId, 654 pub(crate) id: StaticId,
@@ -691,6 +723,14 @@ impl TypeAlias {
691 } 723 }
692} 724}
693 725
726impl HasVisibility for TypeAlias {
727 fn visibility(&self, db: &impl HirDatabase) -> Visibility {
728 let function_data = db.type_alias_data(self.id);
729 let visibility = &function_data.visibility;
730 visibility.resolve(db, &self.id.resolver(db))
731 }
732}
733
694#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 734#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
695pub struct MacroDef { 735pub struct MacroDef {
696 pub(crate) id: MacroDefId, 736 pub(crate) id: MacroDefId,
@@ -778,6 +818,16 @@ impl AssocItem {
778 } 818 }
779} 819}
780 820
821impl HasVisibility for AssocItem {
822 fn visibility(&self, db: &impl HirDatabase) -> Visibility {
823 match self {
824 AssocItem::Function(f) => f.visibility(db),
825 AssocItem::Const(c) => c.visibility(db),
826 AssocItem::TypeAlias(t) => t.visibility(db),
827 }
828 }
829}
830
781#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] 831#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
782pub enum GenericDef { 832pub enum GenericDef {
783 Function(Function), 833 Function(Function),