diff options
Diffstat (limited to 'crates/ra_hir_def/src/nameres/collector.rs')
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 98c74fe25..353a31ad4 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -14,7 +14,7 @@ use ra_cfg::CfgOptions; | |||
14 | use ra_db::{CrateId, FileId, ProcMacroId}; | 14 | use ra_db::{CrateId, FileId, ProcMacroId}; |
15 | use ra_syntax::ast; | 15 | use ra_syntax::ast; |
16 | use rustc_hash::FxHashMap; | 16 | use rustc_hash::FxHashMap; |
17 | use test_utils::tested_by; | 17 | use test_utils::mark; |
18 | 18 | ||
19 | use crate::{ | 19 | use crate::{ |
20 | attr::Attrs, | 20 | attr::Attrs, |
@@ -204,6 +204,7 @@ impl DefCollector<'_> { | |||
204 | ast_id: None, | 204 | ast_id: None, |
205 | krate: Some(krate), | 205 | krate: Some(krate), |
206 | kind: MacroDefKind::CustomDerive(expander), | 206 | kind: MacroDefKind::CustomDerive(expander), |
207 | local_inner: false, | ||
207 | }; | 208 | }; |
208 | 209 | ||
209 | self.define_proc_macro(name.clone(), macro_id); | 210 | self.define_proc_macro(name.clone(), macro_id); |
@@ -301,7 +302,7 @@ impl DefCollector<'_> { | |||
301 | ); | 302 | ); |
302 | 303 | ||
303 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { | 304 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { |
304 | tested_by!(macro_rules_from_other_crates_are_visible_with_macro_use); | 305 | mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use); |
305 | self.import_all_macros_exported(current_module_id, m.krate); | 306 | self.import_all_macros_exported(current_module_id, m.krate); |
306 | } | 307 | } |
307 | } | 308 | } |
@@ -411,10 +412,10 @@ impl DefCollector<'_> { | |||
411 | match def.take_types() { | 412 | match def.take_types() { |
412 | Some(ModuleDefId::ModuleId(m)) => { | 413 | Some(ModuleDefId::ModuleId(m)) => { |
413 | if import.is_prelude { | 414 | if import.is_prelude { |
414 | tested_by!(std_prelude); | 415 | mark::hit!(std_prelude); |
415 | self.def_map.prelude = Some(m); | 416 | self.def_map.prelude = Some(m); |
416 | } else if m.krate != self.def_map.krate { | 417 | } else if m.krate != self.def_map.krate { |
417 | tested_by!(glob_across_crates); | 418 | mark::hit!(glob_across_crates); |
418 | // glob import from other crate => we can just import everything once | 419 | // glob import from other crate => we can just import everything once |
419 | let item_map = self.db.crate_def_map(m.krate); | 420 | let item_map = self.db.crate_def_map(m.krate); |
420 | let scope = &item_map[m.local_id].scope; | 421 | let scope = &item_map[m.local_id].scope; |
@@ -460,7 +461,7 @@ impl DefCollector<'_> { | |||
460 | } | 461 | } |
461 | } | 462 | } |
462 | Some(ModuleDefId::AdtId(AdtId::EnumId(e))) => { | 463 | Some(ModuleDefId::AdtId(AdtId::EnumId(e))) => { |
463 | tested_by!(glob_enum); | 464 | mark::hit!(glob_enum); |
464 | // glob import from enum => just import all the variants | 465 | // glob import from enum => just import all the variants |
465 | 466 | ||
466 | // XXX: urgh, so this works by accident! Here, we look at | 467 | // XXX: urgh, so this works by accident! Here, we look at |
@@ -509,7 +510,7 @@ impl DefCollector<'_> { | |||
509 | 510 | ||
510 | self.update(module_id, &[(name, def)], vis); | 511 | self.update(module_id, &[(name, def)], vis); |
511 | } | 512 | } |
512 | None => tested_by!(bogus_paths), | 513 | None => mark::hit!(bogus_paths), |
513 | } | 514 | } |
514 | } | 515 | } |
515 | } | 516 | } |
@@ -682,7 +683,7 @@ impl ModCollector<'_, '_> { | |||
682 | // Prelude module is always considered to be `#[macro_use]`. | 683 | // Prelude module is always considered to be `#[macro_use]`. |
683 | if let Some(prelude_module) = self.def_collector.def_map.prelude { | 684 | if let Some(prelude_module) = self.def_collector.def_map.prelude { |
684 | if prelude_module.krate != self.def_collector.def_map.krate { | 685 | if prelude_module.krate != self.def_collector.def_map.krate { |
685 | tested_by!(prelude_is_macro_use); | 686 | mark::hit!(prelude_is_macro_use); |
686 | self.def_collector.import_all_macros_exported(self.module_id, prelude_module.krate); | 687 | self.def_collector.import_all_macros_exported(self.module_id, prelude_module.krate); |
687 | } | 688 | } |
688 | } | 689 | } |
@@ -829,7 +830,7 @@ impl ModCollector<'_, '_> { | |||
829 | let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; | 830 | let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; |
830 | let def: ModuleDefId = module.into(); | 831 | let def: ModuleDefId = module.into(); |
831 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); | 832 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); |
832 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis); | 833 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis, false))], vis); |
833 | res | 834 | res |
834 | } | 835 | } |
835 | 836 | ||
@@ -843,6 +844,8 @@ impl ModCollector<'_, '_> { | |||
843 | let name = def.name.clone(); | 844 | let name = def.name.clone(); |
844 | let container = ContainerId::ModuleId(module); | 845 | let container = ContainerId::ModuleId(module); |
845 | let vis = &def.visibility; | 846 | let vis = &def.visibility; |
847 | let mut has_constructor = false; | ||
848 | |||
846 | let def: ModuleDefId = match def.kind { | 849 | let def: ModuleDefId = match def.kind { |
847 | raw::DefKind::Function(ast_id) => FunctionLoc { | 850 | raw::DefKind::Function(ast_id) => FunctionLoc { |
848 | container: container.into(), | 851 | container: container.into(), |
@@ -850,7 +853,8 @@ impl ModCollector<'_, '_> { | |||
850 | } | 853 | } |
851 | .intern(self.def_collector.db) | 854 | .intern(self.def_collector.db) |
852 | .into(), | 855 | .into(), |
853 | raw::DefKind::Struct(ast_id) => { | 856 | raw::DefKind::Struct(ast_id, mode) => { |
857 | has_constructor = mode != raw::StructDefKind::Record; | ||
854 | StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) } | 858 | StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) } |
855 | .intern(self.def_collector.db) | 859 | .intern(self.def_collector.db) |
856 | .into() | 860 | .into() |
@@ -893,7 +897,11 @@ impl ModCollector<'_, '_> { | |||
893 | .def_map | 897 | .def_map |
894 | .resolve_visibility(self.def_collector.db, self.module_id, vis) | 898 | .resolve_visibility(self.def_collector.db, self.module_id, vis) |
895 | .unwrap_or(Visibility::Public); | 899 | .unwrap_or(Visibility::Public); |
896 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis) | 900 | self.def_collector.update( |
901 | self.module_id, | ||
902 | &[(name, PerNs::from_def(def, vis, has_constructor))], | ||
903 | vis, | ||
904 | ) | ||
897 | } | 905 | } |
898 | 906 | ||
899 | fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) { | 907 | fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) { |
@@ -941,6 +949,7 @@ impl ModCollector<'_, '_> { | |||
941 | ast_id: Some(ast_id.ast_id), | 949 | ast_id: Some(ast_id.ast_id), |
942 | krate: Some(self.def_collector.def_map.krate), | 950 | krate: Some(self.def_collector.def_map.krate), |
943 | kind: MacroDefKind::Declarative, | 951 | kind: MacroDefKind::Declarative, |
952 | local_inner: mac.local_inner, | ||
944 | }; | 953 | }; |
945 | self.def_collector.define_macro(self.module_id, name.clone(), macro_id, mac.export); | 954 | self.def_collector.define_macro(self.module_id, name.clone(), macro_id, mac.export); |
946 | } | 955 | } |