aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres/path_resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/nameres/path_resolution.rs')
-rw-r--r--crates/ra_hir_def/src/nameres/path_resolution.rs45
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
63impl CrateDefMap { 63impl 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)