diff options
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 52 |
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 | ||
617 | impl 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)] |
602 | pub struct Const { | 626 | pub struct Const { |
603 | pub(crate) id: ConstId, | 627 | pub(crate) id: ConstId, |
@@ -617,6 +641,14 @@ impl Const { | |||
617 | } | 641 | } |
618 | } | 642 | } |
619 | 643 | ||
644 | impl 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)] |
621 | pub struct Static { | 653 | pub struct Static { |
622 | pub(crate) id: StaticId, | 654 | pub(crate) id: StaticId, |
@@ -691,6 +723,14 @@ impl TypeAlias { | |||
691 | } | 723 | } |
692 | } | 724 | } |
693 | 725 | ||
726 | impl 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)] |
695 | pub struct MacroDef { | 735 | pub struct MacroDef { |
696 | pub(crate) id: MacroDefId, | 736 | pub(crate) id: MacroDefId, |
@@ -778,6 +818,16 @@ impl AssocItem { | |||
778 | } | 818 | } |
779 | } | 819 | } |
780 | 820 | ||
821 | impl 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)] |
782 | pub enum GenericDef { | 832 | pub enum GenericDef { |
783 | Function(Function), | 833 | Function(Function), |