aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/nameres')
-rw-r--r--crates/ra_hir_def/src/nameres/collector.rs19
-rw-r--r--crates/ra_hir_def/src/nameres/path_resolution.rs12
-rw-r--r--crates/ra_hir_def/src/nameres/tests.rs10
3 files changed, 16 insertions, 25 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs
index d27c3e197..4f1fd4801 100644
--- a/crates/ra_hir_def/src/nameres/collector.rs
+++ b/crates/ra_hir_def/src/nameres/collector.rs
@@ -18,7 +18,6 @@ use test_utils::tested_by;
18use crate::{ 18use crate::{
19 attr::Attrs, 19 attr::Attrs,
20 db::DefDatabase, 20 db::DefDatabase,
21 item_scope::Resolution,
22 nameres::{ 21 nameres::{
23 diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, 22 diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint,
24 raw, BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode, 23 raw, BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode,
@@ -215,7 +214,7 @@ where
215 // In Rust, `#[macro_export]` macros are unconditionally visible at the 214 // In Rust, `#[macro_export]` macros are unconditionally visible at the
216 // crate root, even if the parent modules is **not** visible. 215 // crate root, even if the parent modules is **not** visible.
217 if export { 216 if export {
218 self.update(self.def_map.root, &[(name, Resolution { def: PerNs::macros(macro_) })]); 217 self.update(self.def_map.root, &[(name, PerNs::macros(macro_))]);
219 } 218 }
220 } 219 }
221 220
@@ -397,8 +396,7 @@ where
397 .map(|(local_id, variant_data)| { 396 .map(|(local_id, variant_data)| {
398 let name = variant_data.name.clone(); 397 let name = variant_data.name.clone();
399 let variant = EnumVariantId { parent: e, local_id }; 398 let variant = EnumVariantId { parent: e, local_id };
400 let res = 399 let res = PerNs::both(variant.into(), variant.into());
401 Resolution { def: PerNs::both(variant.into(), variant.into()) };
402 (name, res) 400 (name, res)
403 }) 401 })
404 .collect::<Vec<_>>(); 402 .collect::<Vec<_>>();
@@ -424,22 +422,21 @@ where
424 } 422 }
425 } 423 }
426 424
427 let resolution = Resolution { def }; 425 self.update(module_id, &[(name, def)]);
428 self.update(module_id, &[(name, resolution)]);
429 } 426 }
430 None => tested_by!(bogus_paths), 427 None => tested_by!(bogus_paths),
431 } 428 }
432 } 429 }
433 } 430 }
434 431
435 fn update(&mut self, module_id: LocalModuleId, resolutions: &[(Name, Resolution)]) { 432 fn update(&mut self, module_id: LocalModuleId, resolutions: &[(Name, PerNs)]) {
436 self.update_recursive(module_id, resolutions, 0) 433 self.update_recursive(module_id, resolutions, 0)
437 } 434 }
438 435
439 fn update_recursive( 436 fn update_recursive(
440 &mut self, 437 &mut self,
441 module_id: LocalModuleId, 438 module_id: LocalModuleId,
442 resolutions: &[(Name, Resolution)], 439 resolutions: &[(Name, PerNs)],
443 depth: usize, 440 depth: usize,
444 ) { 441 ) {
445 if depth > 100 { 442 if depth > 100 {
@@ -705,8 +702,7 @@ where
705 let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; 702 let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res };
706 let def: ModuleDefId = module.into(); 703 let def: ModuleDefId = module.into();
707 self.def_collector.def_map.modules[self.module_id].scope.define_def(def); 704 self.def_collector.def_map.modules[self.module_id].scope.define_def(def);
708 let resolution = Resolution { def: def.into() }; 705 self.def_collector.update(self.module_id, &[(name, def.into())]);
709 self.def_collector.update(self.module_id, &[(name, resolution)]);
710 res 706 res
711 } 707 }
712 708
@@ -765,8 +761,7 @@ where
765 .into(), 761 .into(),
766 }; 762 };
767 self.def_collector.def_map.modules[self.module_id].scope.define_def(def); 763 self.def_collector.def_map.modules[self.module_id].scope.define_def(def);
768 let resolution = Resolution { def: def.into() }; 764 self.def_collector.update(self.module_id, &[(name, def.into())])
769 self.def_collector.update(self.module_id, &[(name, resolution)])
770 } 765 }
771 766
772 fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) { 767 fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) {
diff --git a/crates/ra_hir_def/src/nameres/path_resolution.rs b/crates/ra_hir_def/src/nameres/path_resolution.rs
index 2dd779b66..378d49455 100644
--- a/crates/ra_hir_def/src/nameres/path_resolution.rs
+++ b/crates/ra_hir_def/src/nameres/path_resolution.rs
@@ -181,7 +181,7 @@ impl CrateDefMap {
181 181
182 // Since it is a qualified path here, it should not contains legacy macros 182 // Since it is a qualified path here, it should not contains legacy macros
183 match self[module.local_id].scope.get(&segment, prefer_module(i)) { 183 match self[module.local_id].scope.get(&segment, prefer_module(i)) {
184 Some(res) => res.def, 184 Some(def) => *def,
185 _ => { 185 _ => {
186 log::debug!("path segment {:?} not found", segment); 186 log::debug!("path segment {:?} not found", segment);
187 return ResolvePathResult::empty(ReachedFixedPoint::No); 187 return ResolvePathResult::empty(ReachedFixedPoint::No);
@@ -243,8 +243,7 @@ impl CrateDefMap {
243 // - std prelude 243 // - std prelude
244 let from_legacy_macro = 244 let from_legacy_macro =
245 self[module].scope.get_legacy_macro(name).map_or_else(PerNs::none, PerNs::macros); 245 self[module].scope.get_legacy_macro(name).map_or_else(PerNs::none, PerNs::macros);
246 let from_scope = 246 let from_scope = self[module].scope.get(name, shadow).copied().unwrap_or_else(PerNs::none);
247 self[module].scope.get(name, shadow).map_or_else(PerNs::none, |res| res.def);
248 let from_extern_prelude = 247 let from_extern_prelude =
249 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)); 248 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it));
250 let from_prelude = self.resolve_in_prelude(db, name, shadow); 249 let from_prelude = self.resolve_in_prelude(db, name, shadow);
@@ -258,7 +257,7 @@ impl CrateDefMap {
258 shadow: BuiltinShadowMode, 257 shadow: BuiltinShadowMode,
259 ) -> PerNs { 258 ) -> PerNs {
260 let from_crate_root = 259 let from_crate_root =
261 self[self.root].scope.get(name, shadow).map_or_else(PerNs::none, |res| res.def); 260 self[self.root].scope.get(name, shadow).copied().unwrap_or_else(PerNs::none);
262 let from_extern_prelude = self.resolve_name_in_extern_prelude(name); 261 let from_extern_prelude = self.resolve_name_in_extern_prelude(name);
263 262
264 from_crate_root.or(from_extern_prelude) 263 from_crate_root.or(from_extern_prelude)
@@ -279,10 +278,7 @@ impl CrateDefMap {
279 keep = db.crate_def_map(prelude.krate); 278 keep = db.crate_def_map(prelude.krate);
280 &keep 279 &keep
281 }; 280 };
282 def_map[prelude.local_id] 281 def_map[prelude.local_id].scope.get(name, shadow).copied().unwrap_or_else(PerNs::none)
283 .scope
284 .get(name, shadow)
285 .map_or_else(PerNs::none, |res| res.def)
286 } else { 282 } else {
287 PerNs::none() 283 PerNs::none()
288 } 284 }
diff --git a/crates/ra_hir_def/src/nameres/tests.rs b/crates/ra_hir_def/src/nameres/tests.rs
index 4e968bcc8..ff474b53b 100644
--- a/crates/ra_hir_def/src/nameres/tests.rs
+++ b/crates/ra_hir_def/src/nameres/tests.rs
@@ -35,19 +35,19 @@ fn render_crate_def_map(map: &CrateDefMap) -> String {
35 let mut entries = map.modules[module].scope.collect_resolutions(); 35 let mut entries = map.modules[module].scope.collect_resolutions();
36 entries.sort_by_key(|(name, _)| name.clone()); 36 entries.sort_by_key(|(name, _)| name.clone());
37 37
38 for (name, res) in entries { 38 for (name, def) in entries {
39 *buf += &format!("{}:", name); 39 *buf += &format!("{}:", name);
40 40
41 if res.def.types.is_some() { 41 if def.types.is_some() {
42 *buf += " t"; 42 *buf += " t";
43 } 43 }
44 if res.def.values.is_some() { 44 if def.values.is_some() {
45 *buf += " v"; 45 *buf += " v";
46 } 46 }
47 if res.def.macros.is_some() { 47 if def.macros.is_some() {
48 *buf += " m"; 48 *buf += " m";
49 } 49 }
50 if res.def.is_none() { 50 if def.is_none() {
51 *buf += " _"; 51 *buf += " _";
52 } 52 }
53 53