aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/visibility.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/visibility.rs')
-rw-r--r--crates/ra_hir_def/src/visibility.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/crates/ra_hir_def/src/visibility.rs b/crates/ra_hir_def/src/visibility.rs
index 8cac52630..990b2975c 100644
--- a/crates/ra_hir_def/src/visibility.rs
+++ b/crates/ra_hir_def/src/visibility.rs
@@ -134,13 +134,25 @@ impl ResolvedVisibility {
134 if from_module.krate != to_module.krate { 134 if from_module.krate != to_module.krate {
135 return false; 135 return false;
136 } 136 }
137 // from_module needs to be a descendant of to_module
138 let def_map = db.crate_def_map(from_module.krate); 137 let def_map = db.crate_def_map(from_module.krate);
138 self.visible_from_def_map(&def_map, from_module.local_id)
139 }
140
141 pub(crate) fn visible_from_def_map(
142 self,
143 def_map: &crate::nameres::CrateDefMap,
144 from_module: crate::LocalModuleId,
145 ) -> bool {
146 let to_module = match self {
147 ResolvedVisibility::Module(m) => m,
148 ResolvedVisibility::Public => return true,
149 };
150 // from_module needs to be a descendant of to_module
139 let mut ancestors = std::iter::successors(Some(from_module), |m| { 151 let mut ancestors = std::iter::successors(Some(from_module), |m| {
140 let parent_id = def_map[m.local_id].parent?; 152 let parent_id = def_map[*m].parent?;
141 Some(ModuleId { local_id: parent_id, ..*m }) 153 Some(parent_id)
142 }); 154 });
143 ancestors.any(|m| m == to_module) 155 ancestors.any(|m| m == to_module.local_id)
144 } 156 }
145} 157}
146 158