diff options
author | Florian Diebold <[email protected]> | 2019-12-25 14:00:10 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-12-26 15:23:40 +0000 |
commit | 8ac25f119eb45d425370d9f7f093bc206e6c4a9f (patch) | |
tree | 7a9bcbcb2c46a549baa7a411a99cd7c9eb39423d /crates/ra_hir_def/src/nameres/path_resolution.rs | |
parent | 79c90b5641d2934864c587380e4f050ab63ac029 (diff) |
Keep track of visibility during def collection
Diffstat (limited to 'crates/ra_hir_def/src/nameres/path_resolution.rs')
-rw-r--r-- | crates/ra_hir_def/src/nameres/path_resolution.rs | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/crates/ra_hir_def/src/nameres/path_resolution.rs b/crates/ra_hir_def/src/nameres/path_resolution.rs index d88076aa7..a56e3f08b 100644 --- a/crates/ra_hir_def/src/nameres/path_resolution.rs +++ b/crates/ra_hir_def/src/nameres/path_resolution.rs | |||
@@ -62,7 +62,9 @@ impl ResolvePathResult { | |||
62 | 62 | ||
63 | impl CrateDefMap { | 63 | impl CrateDefMap { |
64 | pub(super) fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs { | 64 | pub(super) fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs { |
65 | self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)) | 65 | self.extern_prelude |
66 | .get(name) | ||
67 | .map_or(PerNs::none(), |&it| PerNs::types(it, ResolvedVisibility::Public)) | ||
66 | } | 68 | } |
67 | 69 | ||
68 | pub(crate) fn resolve_visibility( | 70 | pub(crate) fn resolve_visibility( |
@@ -115,17 +117,21 @@ impl CrateDefMap { | |||
115 | PathKind::DollarCrate(krate) => { | 117 | PathKind::DollarCrate(krate) => { |
116 | if krate == self.krate { | 118 | if krate == self.krate { |
117 | tested_by!(macro_dollar_crate_self); | 119 | tested_by!(macro_dollar_crate_self); |
118 | PerNs::types(ModuleId { krate: self.krate, local_id: self.root }.into()) | 120 | PerNs::types( |
121 | ModuleId { krate: self.krate, local_id: self.root }.into(), | ||
122 | ResolvedVisibility::Public, | ||
123 | ) | ||
119 | } else { | 124 | } else { |
120 | let def_map = db.crate_def_map(krate); | 125 | let def_map = db.crate_def_map(krate); |
121 | let module = ModuleId { krate, local_id: def_map.root }; | 126 | let module = ModuleId { krate, local_id: def_map.root }; |
122 | tested_by!(macro_dollar_crate_other); | 127 | tested_by!(macro_dollar_crate_other); |
123 | PerNs::types(module.into()) | 128 | PerNs::types(module.into(), ResolvedVisibility::Public) |
124 | } | 129 | } |
125 | } | 130 | } |
126 | PathKind::Crate => { | 131 | PathKind::Crate => PerNs::types( |
127 | PerNs::types(ModuleId { krate: self.krate, local_id: self.root }.into()) | 132 | ModuleId { krate: self.krate, local_id: self.root }.into(), |
128 | } | 133 | ResolvedVisibility::Public, |
134 | ), | ||
129 | // plain import or absolute path in 2015: crate-relative with | 135 | // plain import or absolute path in 2015: crate-relative with |
130 | // fallback to extern prelude (with the simplification in | 136 | // fallback to extern prelude (with the simplification in |
131 | // rust-lang/rust#57745) | 137 | // rust-lang/rust#57745) |
@@ -153,7 +159,10 @@ impl CrateDefMap { | |||
153 | let m = successors(Some(original_module), |m| self.modules[*m].parent) | 159 | let m = successors(Some(original_module), |m| self.modules[*m].parent) |
154 | .nth(lvl as usize); | 160 | .nth(lvl as usize); |
155 | if let Some(local_id) = m { | 161 | if let Some(local_id) = m { |
156 | PerNs::types(ModuleId { krate: self.krate, local_id }.into()) | 162 | PerNs::types( |
163 | ModuleId { krate: self.krate, local_id }.into(), | ||
164 | ResolvedVisibility::Public, | ||
165 | ) | ||
157 | } else { | 166 | } else { |
158 | log::debug!("super path in root module"); | 167 | log::debug!("super path in root module"); |
159 | return ResolvePathResult::empty(ReachedFixedPoint::Yes); | 168 | return ResolvePathResult::empty(ReachedFixedPoint::Yes); |
@@ -167,7 +176,7 @@ impl CrateDefMap { | |||
167 | }; | 176 | }; |
168 | if let Some(def) = self.extern_prelude.get(&segment) { | 177 | if let Some(def) = self.extern_prelude.get(&segment) { |
169 | log::debug!("absolute path {:?} resolved to crate {:?}", path, def); | 178 | log::debug!("absolute path {:?} resolved to crate {:?}", path, def); |
170 | PerNs::types(*def) | 179 | PerNs::types(*def, ResolvedVisibility::Public) |
171 | } else { | 180 | } else { |
172 | return ResolvePathResult::empty(ReachedFixedPoint::No); // extern crate declarations can add to the extern prelude | 181 | return ResolvePathResult::empty(ReachedFixedPoint::No); // extern crate declarations can add to the extern prelude |
173 | } | 182 | } |
@@ -175,7 +184,7 @@ impl CrateDefMap { | |||
175 | }; | 184 | }; |
176 | 185 | ||
177 | for (i, segment) in segments { | 186 | for (i, segment) in segments { |
178 | let curr = match curr_per_ns.take_types() { | 187 | let (curr, vis) = match curr_per_ns.take_types_vis() { |
179 | Some(r) => r, | 188 | Some(r) => r, |
180 | None => { | 189 | None => { |
181 | // we still have path segments left, but the path so far | 190 | // we still have path segments left, but the path so far |
@@ -216,11 +225,11 @@ impl CrateDefMap { | |||
216 | match enum_data.variant(&segment) { | 225 | match enum_data.variant(&segment) { |
217 | Some(local_id) => { | 226 | Some(local_id) => { |
218 | let variant = EnumVariantId { parent: e, local_id }; | 227 | let variant = EnumVariantId { parent: e, local_id }; |
219 | PerNs::both(variant.into(), variant.into()) | 228 | PerNs::both(variant.into(), variant.into(), ResolvedVisibility::Public) |
220 | } | 229 | } |
221 | None => { | 230 | None => { |
222 | return ResolvePathResult::with( | 231 | return ResolvePathResult::with( |
223 | PerNs::types(e.into()), | 232 | PerNs::types(e.into(), vis), |
224 | ReachedFixedPoint::Yes, | 233 | ReachedFixedPoint::Yes, |
225 | Some(i), | 234 | Some(i), |
226 | Some(self.krate), | 235 | Some(self.krate), |
@@ -238,7 +247,7 @@ impl CrateDefMap { | |||
238 | ); | 247 | ); |
239 | 248 | ||
240 | return ResolvePathResult::with( | 249 | return ResolvePathResult::with( |
241 | PerNs::types(s), | 250 | PerNs::types(s, vis), |
242 | ReachedFixedPoint::Yes, | 251 | ReachedFixedPoint::Yes, |
243 | Some(i), | 252 | Some(i), |
244 | Some(self.krate), | 253 | Some(self.krate), |
@@ -262,11 +271,15 @@ impl CrateDefMap { | |||
262 | // - current module / scope | 271 | // - current module / scope |
263 | // - extern prelude | 272 | // - extern prelude |
264 | // - std prelude | 273 | // - std prelude |
265 | let from_legacy_macro = | 274 | let from_legacy_macro = self[module] |
266 | self[module].scope.get_legacy_macro(name).map_or_else(PerNs::none, PerNs::macros); | 275 | .scope |
276 | .get_legacy_macro(name) | ||
277 | .map_or_else(PerNs::none, |m| PerNs::macros(m, ResolvedVisibility::Public)); | ||
267 | let from_scope = self[module].scope.get(name, shadow); | 278 | let from_scope = self[module].scope.get(name, shadow); |
268 | let from_extern_prelude = | 279 | let from_extern_prelude = self |
269 | self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)); | 280 | .extern_prelude |
281 | .get(name) | ||
282 | .map_or(PerNs::none(), |&it| PerNs::types(it, ResolvedVisibility::Public)); | ||
270 | let from_prelude = self.resolve_in_prelude(db, name, shadow); | 283 | let from_prelude = self.resolve_in_prelude(db, name, shadow); |
271 | 284 | ||
272 | from_legacy_macro.or(from_scope).or(from_extern_prelude).or(from_prelude) | 285 | from_legacy_macro.or(from_scope).or(from_extern_prelude).or(from_prelude) |