diff options
Diffstat (limited to 'crates/ra_hir_def/src/visibility.rs')
-rw-r--r-- | crates/ra_hir_def/src/visibility.rs | 20 |
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 | ||