diff options
Diffstat (limited to 'crates/hir_def/src/nameres/collector.rs')
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 212 |
1 files changed, 127 insertions, 85 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 0cd61698c..e51d89b43 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -13,7 +13,7 @@ use hir_expand::{ | |||
13 | builtin_macro::find_builtin_macro, | 13 | builtin_macro::find_builtin_macro, |
14 | name::{AsName, Name}, | 14 | name::{AsName, Name}, |
15 | proc_macro::ProcMacroExpander, | 15 | proc_macro::ProcMacroExpander, |
16 | HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, | 16 | HirFileId, MacroCallId, MacroDefId, MacroDefKind, |
17 | }; | 17 | }; |
18 | use hir_expand::{InFile, MacroCallLoc}; | 18 | use hir_expand::{InFile, MacroCallLoc}; |
19 | use rustc_hash::{FxHashMap, FxHashSet}; | 19 | use rustc_hash::{FxHashMap, FxHashSet}; |
@@ -24,38 +24,43 @@ use tt::{Leaf, TokenTree}; | |||
24 | use crate::{ | 24 | use crate::{ |
25 | attr::Attrs, | 25 | attr::Attrs, |
26 | db::DefDatabase, | 26 | db::DefDatabase, |
27 | item_attr_as_call_id, | ||
27 | item_scope::{ImportType, PerNsGlobImports}, | 28 | item_scope::{ImportType, PerNsGlobImports}, |
28 | item_tree::{ | 29 | item_tree::{ |
29 | self, FileItemTreeId, ItemTree, ItemTreeId, MacroCall, MacroRules, Mod, ModItem, ModKind, | 30 | self, FileItemTreeId, ItemTree, ItemTreeId, MacroCall, MacroRules, Mod, ModItem, ModKind, |
30 | StructDefKind, | 31 | StructDefKind, |
31 | }, | 32 | }, |
33 | macro_call_as_call_id, | ||
32 | nameres::{ | 34 | nameres::{ |
33 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, | 35 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, |
34 | BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode, | 36 | BuiltinShadowMode, DefMap, ModuleData, ModuleOrigin, ResolveMode, |
35 | }, | 37 | }, |
36 | path::{ImportAlias, ModPath, PathKind}, | 38 | path::{ImportAlias, ModPath, PathKind}, |
37 | per_ns::PerNs, | 39 | per_ns::PerNs, |
38 | visibility::{RawVisibility, Visibility}, | 40 | visibility::{RawVisibility, Visibility}, |
39 | AdtId, AsMacroCall, AstId, AstIdWithPath, ConstLoc, ContainerId, EnumLoc, EnumVariantId, | 41 | AdtId, AstId, AstIdWithPath, ConstLoc, ContainerId, EnumLoc, EnumVariantId, FunctionLoc, |
40 | FunctionLoc, ImplLoc, Intern, LocalModuleId, ModuleDefId, ModuleId, StaticLoc, StructLoc, | 42 | ImplLoc, Intern, LocalModuleId, ModuleDefId, StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, |
41 | TraitLoc, TypeAliasLoc, UnionLoc, | 43 | UnionLoc, UnresolvedMacro, |
42 | }; | 44 | }; |
43 | 45 | ||
44 | const GLOB_RECURSION_LIMIT: usize = 100; | 46 | const GLOB_RECURSION_LIMIT: usize = 100; |
45 | const EXPANSION_DEPTH_LIMIT: usize = 128; | 47 | const EXPANSION_DEPTH_LIMIT: usize = 128; |
46 | const FIXED_POINT_LIMIT: usize = 8192; | 48 | const FIXED_POINT_LIMIT: usize = 8192; |
47 | 49 | ||
48 | pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { | 50 | pub(super) fn collect_defs( |
51 | db: &dyn DefDatabase, | ||
52 | mut def_map: DefMap, | ||
53 | block: Option<AstId<ast::BlockExpr>>, | ||
54 | ) -> DefMap { | ||
49 | let crate_graph = db.crate_graph(); | 55 | let crate_graph = db.crate_graph(); |
50 | 56 | ||
51 | // populate external prelude | 57 | // populate external prelude |
52 | for dep in &crate_graph[def_map.krate].dependencies { | 58 | for dep in &crate_graph[def_map.krate].dependencies { |
53 | log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id); | 59 | log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id); |
54 | let dep_def_map = db.crate_def_map(dep.crate_id); | 60 | let dep_def_map = db.crate_def_map(dep.crate_id); |
55 | def_map.extern_prelude.insert( | 61 | def_map |
56 | dep.as_name(), | 62 | .extern_prelude |
57 | ModuleId { krate: dep.crate_id, local_id: dep_def_map.root }.into(), | 63 | .insert(dep.as_name(), dep_def_map.module_id(dep_def_map.root).into()); |
58 | ); | ||
59 | 64 | ||
60 | // look for the prelude | 65 | // look for the prelude |
61 | // If the dependency defines a prelude, we overwrite an already defined | 66 | // If the dependency defines a prelude, we overwrite an already defined |
@@ -93,6 +98,14 @@ pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> Cr | |||
93 | exports_proc_macros: false, | 98 | exports_proc_macros: false, |
94 | from_glob_import: Default::default(), | 99 | from_glob_import: Default::default(), |
95 | }; | 100 | }; |
101 | match block { | ||
102 | Some(block) => { | ||
103 | collector.seed_with_inner(block); | ||
104 | } | ||
105 | None => { | ||
106 | collector.seed_with_top_level(); | ||
107 | } | ||
108 | } | ||
96 | collector.collect(); | 109 | collector.collect(); |
97 | collector.finish() | 110 | collector.finish() |
98 | } | 111 | } |
@@ -210,7 +223,7 @@ struct DefData<'a> { | |||
210 | /// Walks the tree of module recursively | 223 | /// Walks the tree of module recursively |
211 | struct DefCollector<'a> { | 224 | struct DefCollector<'a> { |
212 | db: &'a dyn DefDatabase, | 225 | db: &'a dyn DefDatabase, |
213 | def_map: CrateDefMap, | 226 | def_map: DefMap, |
214 | glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility)>>, | 227 | glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility)>>, |
215 | unresolved_imports: Vec<ImportDirective>, | 228 | unresolved_imports: Vec<ImportDirective>, |
216 | resolved_imports: Vec<ImportDirective>, | 229 | resolved_imports: Vec<ImportDirective>, |
@@ -228,7 +241,7 @@ struct DefCollector<'a> { | |||
228 | } | 241 | } |
229 | 242 | ||
230 | impl DefCollector<'_> { | 243 | impl DefCollector<'_> { |
231 | fn collect(&mut self) { | 244 | fn seed_with_top_level(&mut self) { |
232 | let file_id = self.db.crate_graph()[self.def_map.krate].root_file_id; | 245 | let file_id = self.db.crate_graph()[self.def_map.krate].root_file_id; |
233 | let item_tree = self.db.item_tree(file_id.into()); | 246 | let item_tree = self.db.item_tree(file_id.into()); |
234 | let module_id = self.def_map.root; | 247 | let module_id = self.def_map.root; |
@@ -248,7 +261,30 @@ impl DefCollector<'_> { | |||
248 | } | 261 | } |
249 | .collect(item_tree.top_level_items()); | 262 | .collect(item_tree.top_level_items()); |
250 | } | 263 | } |
264 | } | ||
251 | 265 | ||
266 | fn seed_with_inner(&mut self, block: AstId<ast::BlockExpr>) { | ||
267 | let item_tree = self.db.item_tree(block.file_id); | ||
268 | let module_id = self.def_map.root; | ||
269 | self.def_map.modules[module_id].origin = ModuleOrigin::BlockExpr { block }; | ||
270 | if item_tree | ||
271 | .top_level_attrs(self.db, self.def_map.krate) | ||
272 | .cfg() | ||
273 | .map_or(true, |cfg| self.cfg_options.check(&cfg) != Some(false)) | ||
274 | { | ||
275 | ModCollector { | ||
276 | def_collector: &mut *self, | ||
277 | macro_depth: 0, | ||
278 | module_id, | ||
279 | file_id: block.file_id, | ||
280 | item_tree: &item_tree, | ||
281 | mod_dir: ModDir::root(), | ||
282 | } | ||
283 | .collect(item_tree.inner_items_of_block(block.value)); | ||
284 | } | ||
285 | } | ||
286 | |||
287 | fn collect(&mut self) { | ||
252 | // main name resolution fixed-point loop. | 288 | // main name resolution fixed-point loop. |
253 | let mut i = 0; | 289 | let mut i = 0; |
254 | loop { | 290 | loop { |
@@ -296,11 +332,9 @@ impl DefCollector<'_> { | |||
296 | // exported in type/value namespace. This function reduces the visibility of all items | 332 | // exported in type/value namespace. This function reduces the visibility of all items |
297 | // in the crate root that aren't proc macros. | 333 | // in the crate root that aren't proc macros. |
298 | let root = self.def_map.root; | 334 | let root = self.def_map.root; |
335 | let module_id = self.def_map.module_id(root); | ||
299 | let root = &mut self.def_map.modules[root]; | 336 | let root = &mut self.def_map.modules[root]; |
300 | root.scope.censor_non_proc_macros(ModuleId { | 337 | root.scope.censor_non_proc_macros(module_id); |
301 | krate: self.def_map.krate, | ||
302 | local_id: self.def_map.root, | ||
303 | }); | ||
304 | } | 338 | } |
305 | } | 339 | } |
306 | 340 | ||
@@ -542,7 +576,7 @@ impl DefCollector<'_> { | |||
542 | } else if m.krate != self.def_map.krate { | 576 | } else if m.krate != self.def_map.krate { |
543 | mark::hit!(glob_across_crates); | 577 | mark::hit!(glob_across_crates); |
544 | // glob import from other crate => we can just import everything once | 578 | // glob import from other crate => we can just import everything once |
545 | let item_map = self.db.crate_def_map(m.krate); | 579 | let item_map = m.def_map(self.db); |
546 | let scope = &item_map[m.local_id].scope; | 580 | let scope = &item_map[m.local_id].scope; |
547 | 581 | ||
548 | // Module scoped macros is included | 582 | // Module scoped macros is included |
@@ -560,7 +594,13 @@ impl DefCollector<'_> { | |||
560 | // glob import from same crate => we do an initial | 594 | // glob import from same crate => we do an initial |
561 | // import, and then need to propagate any further | 595 | // import, and then need to propagate any further |
562 | // additions | 596 | // additions |
563 | let scope = &self.def_map[m.local_id].scope; | 597 | let def_map; |
598 | let scope = if m.block == self.def_map.block_id() { | ||
599 | &self.def_map[m.local_id].scope | ||
600 | } else { | ||
601 | def_map = m.def_map(self.db); | ||
602 | &def_map[m.local_id].scope | ||
603 | }; | ||
564 | 604 | ||
565 | // Module scoped macros is included | 605 | // Module scoped macros is included |
566 | let items = scope | 606 | let items = scope |
@@ -570,7 +610,7 @@ impl DefCollector<'_> { | |||
570 | ( | 610 | ( |
571 | n, | 611 | n, |
572 | res.filter_visibility(|v| { | 612 | res.filter_visibility(|v| { |
573 | v.is_visible_from_def_map(&self.def_map, module_id) | 613 | v.is_visible_from_def_map(self.db, &self.def_map, module_id) |
574 | }), | 614 | }), |
575 | ) | 615 | ) |
576 | }) | 616 | }) |
@@ -617,7 +657,7 @@ impl DefCollector<'_> { | |||
617 | } | 657 | } |
618 | } | 658 | } |
619 | } else { | 659 | } else { |
620 | match import.path.segments.last() { | 660 | match import.path.segments().last() { |
621 | Some(last_segment) => { | 661 | Some(last_segment) => { |
622 | let name = match &import.alias { | 662 | let name = match &import.alias { |
623 | Some(ImportAlias::Alias(name)) => Some(name.clone()), | 663 | Some(ImportAlias::Alias(name)) => Some(name.clone()), |
@@ -723,7 +763,7 @@ impl DefCollector<'_> { | |||
723 | .filter(|(glob_importing_module, _)| { | 763 | .filter(|(glob_importing_module, _)| { |
724 | // we know all resolutions have the same visibility (`vis`), so we | 764 | // we know all resolutions have the same visibility (`vis`), so we |
725 | // just need to check that once | 765 | // just need to check that once |
726 | vis.is_visible_from_def_map(&self.def_map, *glob_importing_module) | 766 | vis.is_visible_from_def_map(self.db, &self.def_map, *glob_importing_module) |
727 | }) | 767 | }) |
728 | .cloned() | 768 | .cloned() |
729 | .collect::<Vec<_>>(); | 769 | .collect::<Vec<_>>(); |
@@ -752,8 +792,11 @@ impl DefCollector<'_> { | |||
752 | return false; | 792 | return false; |
753 | } | 793 | } |
754 | 794 | ||
755 | if let Some(call_id) = | 795 | match macro_call_as_call_id( |
756 | directive.ast_id.as_call_id(self.db, self.def_map.krate, |path| { | 796 | &directive.ast_id, |
797 | self.db, | ||
798 | self.def_map.krate, | ||
799 | |path| { | ||
757 | let resolved_res = self.def_map.resolve_path_fp_with_macro( | 800 | let resolved_res = self.def_map.resolve_path_fp_with_macro( |
758 | self.db, | 801 | self.db, |
759 | ResolveMode::Other, | 802 | ResolveMode::Other, |
@@ -762,24 +805,29 @@ impl DefCollector<'_> { | |||
762 | BuiltinShadowMode::Module, | 805 | BuiltinShadowMode::Module, |
763 | ); | 806 | ); |
764 | resolved_res.resolved_def.take_macros() | 807 | resolved_res.resolved_def.take_macros() |
765 | }) | 808 | }, |
766 | { | 809 | &mut |_err| (), |
767 | resolved.push((directive.module_id, call_id, directive.depth)); | 810 | ) { |
768 | res = ReachedFixedPoint::No; | 811 | Ok(Ok(call_id)) => { |
769 | return false; | 812 | resolved.push((directive.module_id, call_id, directive.depth)); |
813 | res = ReachedFixedPoint::No; | ||
814 | return false; | ||
815 | } | ||
816 | Err(UnresolvedMacro) | Ok(Err(_)) => {} | ||
770 | } | 817 | } |
771 | 818 | ||
772 | true | 819 | true |
773 | }); | 820 | }); |
774 | attribute_macros.retain(|directive| { | 821 | attribute_macros.retain(|directive| { |
775 | if let Some(call_id) = | 822 | match item_attr_as_call_id(&directive.ast_id, self.db, self.def_map.krate, |path| { |
776 | directive.ast_id.as_call_id(self.db, self.def_map.krate, |path| { | 823 | self.resolve_attribute_macro(&directive, &path) |
777 | self.resolve_attribute_macro(&directive, &path) | 824 | }) { |
778 | }) | 825 | Ok(call_id) => { |
779 | { | 826 | resolved.push((directive.module_id, call_id, 0)); |
780 | resolved.push((directive.module_id, call_id, 0)); | 827 | res = ReachedFixedPoint::No; |
781 | res = ReachedFixedPoint::No; | 828 | return false; |
782 | return false; | 829 | } |
830 | Err(UnresolvedMacro) => (), | ||
783 | } | 831 | } |
784 | 832 | ||
785 | true | 833 | true |
@@ -859,12 +907,13 @@ impl DefCollector<'_> { | |||
859 | .collect(item_tree.top_level_items()); | 907 | .collect(item_tree.top_level_items()); |
860 | } | 908 | } |
861 | 909 | ||
862 | fn finish(mut self) -> CrateDefMap { | 910 | fn finish(mut self) -> DefMap { |
863 | // Emit diagnostics for all remaining unexpanded macros. | 911 | // Emit diagnostics for all remaining unexpanded macros. |
864 | 912 | ||
865 | for directive in &self.unexpanded_macros { | 913 | for directive in &self.unexpanded_macros { |
866 | let mut error = None; | 914 | let mut error = None; |
867 | directive.ast_id.as_call_id_with_errors( | 915 | match macro_call_as_call_id( |
916 | &directive.ast_id, | ||
868 | self.db, | 917 | self.db, |
869 | self.def_map.krate, | 918 | self.def_map.krate, |
870 | |path| { | 919 | |path| { |
@@ -880,15 +929,15 @@ impl DefCollector<'_> { | |||
880 | &mut |e| { | 929 | &mut |e| { |
881 | error.get_or_insert(e); | 930 | error.get_or_insert(e); |
882 | }, | 931 | }, |
883 | ); | 932 | ) { |
884 | 933 | Ok(_) => (), | |
885 | if let Some(err) = error { | 934 | Err(UnresolvedMacro) => { |
886 | self.def_map.diagnostics.push(DefDiagnostic::macro_error( | 935 | self.def_map.diagnostics.push(DefDiagnostic::unresolved_macro_call( |
887 | directive.module_id, | 936 | directive.module_id, |
888 | MacroCallKind::FnLike(directive.ast_id.ast_id), | 937 | directive.ast_id.ast_id, |
889 | err.to_string(), | 938 | )); |
890 | )); | 939 | } |
891 | } | 940 | }; |
892 | } | 941 | } |
893 | 942 | ||
894 | // Emit diagnostics for all remaining unresolved imports. | 943 | // Emit diagnostics for all remaining unresolved imports. |
@@ -918,7 +967,7 @@ impl DefCollector<'_> { | |||
918 | let item_tree = self.db.item_tree(import.file_id); | 967 | let item_tree = self.db.item_tree(import.file_id); |
919 | let import_data = &item_tree[import.value]; | 968 | let import_data = &item_tree[import.value]; |
920 | 969 | ||
921 | match (import_data.path.segments.first(), &import_data.path.kind) { | 970 | match (import_data.path.segments().first(), &import_data.path.kind) { |
922 | (Some(krate), PathKind::Plain) | (Some(krate), PathKind::Abs) => { | 971 | (Some(krate), PathKind::Plain) | (Some(krate), PathKind::Abs) => { |
923 | if diagnosed_extern_crates.contains(krate) { | 972 | if diagnosed_extern_crates.contains(krate) { |
924 | continue; | 973 | continue; |
@@ -993,8 +1042,7 @@ impl ModCollector<'_, '_> { | |||
993 | continue; | 1042 | continue; |
994 | } | 1043 | } |
995 | } | 1044 | } |
996 | let module = | 1045 | let module = self.def_collector.def_map.module_id(self.module_id); |
997 | ModuleId { krate: self.def_collector.def_map.krate, local_id: self.module_id }; | ||
998 | let container = ContainerId::ModuleId(module); | 1046 | let container = ContainerId::ModuleId(module); |
999 | 1047 | ||
1000 | let mut def = None; | 1048 | let mut def = None; |
@@ -1061,10 +1109,7 @@ impl ModCollector<'_, '_> { | |||
1061 | } | 1109 | } |
1062 | } | 1110 | } |
1063 | ModItem::Impl(imp) => { | 1111 | ModItem::Impl(imp) => { |
1064 | let module = ModuleId { | 1112 | let module = self.def_collector.def_map.module_id(self.module_id); |
1065 | krate: self.def_collector.def_map.krate, | ||
1066 | local_id: self.module_id, | ||
1067 | }; | ||
1068 | let container = ContainerId::ModuleId(module); | 1113 | let container = ContainerId::ModuleId(module); |
1069 | let impl_id = ImplLoc { container, id: ItemTreeId::new(self.file_id, imp) } | 1114 | let impl_id = ImplLoc { container, id: ItemTreeId::new(self.file_id, imp) } |
1070 | .intern(self.def_collector.db); | 1115 | .intern(self.def_collector.db); |
@@ -1245,12 +1290,8 @@ impl ModCollector<'_, '_> { | |||
1245 | // out of line module, resolve, parse and recurse | 1290 | // out of line module, resolve, parse and recurse |
1246 | ModKind::Outline {} => { | 1291 | ModKind::Outline {} => { |
1247 | let ast_id = AstId::new(self.file_id, module.ast_id); | 1292 | let ast_id = AstId::new(self.file_id, module.ast_id); |
1248 | match self.mod_dir.resolve_declaration( | 1293 | let db = self.def_collector.db; |
1249 | self.def_collector.db, | 1294 | match self.mod_dir.resolve_declaration(db, self.file_id, &module.name, path_attr) { |
1250 | self.file_id, | ||
1251 | &module.name, | ||
1252 | path_attr, | ||
1253 | ) { | ||
1254 | Ok((file_id, is_mod_rs, mod_dir)) => { | 1295 | Ok((file_id, is_mod_rs, mod_dir)) => { |
1255 | let module_id = self.push_child_module( | 1296 | let module_id = self.push_child_module( |
1256 | module.name.clone(), | 1297 | module.name.clone(), |
@@ -1258,7 +1299,7 @@ impl ModCollector<'_, '_> { | |||
1258 | Some((file_id, is_mod_rs)), | 1299 | Some((file_id, is_mod_rs)), |
1259 | &self.item_tree[module.visibility], | 1300 | &self.item_tree[module.visibility], |
1260 | ); | 1301 | ); |
1261 | let item_tree = self.def_collector.db.item_tree(file_id.into()); | 1302 | let item_tree = db.item_tree(file_id.into()); |
1262 | ModCollector { | 1303 | ModCollector { |
1263 | def_collector: &mut *self.def_collector, | 1304 | def_collector: &mut *self.def_collector, |
1264 | macro_depth: self.macro_depth, | 1305 | macro_depth: self.macro_depth, |
@@ -1268,7 +1309,12 @@ impl ModCollector<'_, '_> { | |||
1268 | mod_dir, | 1309 | mod_dir, |
1269 | } | 1310 | } |
1270 | .collect(item_tree.top_level_items()); | 1311 | .collect(item_tree.top_level_items()); |
1271 | if is_macro_use { | 1312 | if is_macro_use |
1313 | || item_tree | ||
1314 | .top_level_attrs(db, self.def_collector.def_map.krate) | ||
1315 | .by_key("macro_use") | ||
1316 | .exists() | ||
1317 | { | ||
1272 | self.import_all_legacy_macros(module_id); | 1318 | self.import_all_legacy_macros(module_id); |
1273 | } | 1319 | } |
1274 | } | 1320 | } |
@@ -1307,7 +1353,7 @@ impl ModCollector<'_, '_> { | |||
1307 | modules[res].scope.define_legacy_macro(name, mac) | 1353 | modules[res].scope.define_legacy_macro(name, mac) |
1308 | } | 1354 | } |
1309 | modules[self.module_id].children.insert(name.clone(), res); | 1355 | modules[self.module_id].children.insert(name.clone(), res); |
1310 | let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; | 1356 | let module = self.def_collector.def_map.module_id(res); |
1311 | let def: ModuleDefId = module.into(); | 1357 | let def: ModuleDefId = module.into(); |
1312 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); | 1358 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); |
1313 | self.def_collector.update( | 1359 | self.def_collector.update( |
@@ -1411,13 +1457,21 @@ impl ModCollector<'_, '_> { | |||
1411 | let mut ast_id = AstIdWithPath::new(self.file_id, mac.ast_id, mac.path.clone()); | 1457 | let mut ast_id = AstIdWithPath::new(self.file_id, mac.ast_id, mac.path.clone()); |
1412 | 1458 | ||
1413 | // Case 1: try to resolve in legacy scope and expand macro_rules | 1459 | // Case 1: try to resolve in legacy scope and expand macro_rules |
1414 | if let Some(macro_call_id) = | 1460 | if let Ok(Ok(macro_call_id)) = macro_call_as_call_id( |
1415 | ast_id.as_call_id(self.def_collector.db, self.def_collector.def_map.krate, |path| { | 1461 | &ast_id, |
1462 | self.def_collector.db, | ||
1463 | self.def_collector.def_map.krate, | ||
1464 | |path| { | ||
1416 | path.as_ident().and_then(|name| { | 1465 | path.as_ident().and_then(|name| { |
1417 | self.def_collector.def_map[self.module_id].scope.get_legacy_macro(&name) | 1466 | self.def_collector.def_map.with_ancestor_maps( |
1467 | self.def_collector.db, | ||
1468 | self.module_id, | ||
1469 | &mut |map, module| map[module].scope.get_legacy_macro(&name), | ||
1470 | ) | ||
1418 | }) | 1471 | }) |
1419 | }) | 1472 | }, |
1420 | { | 1473 | &mut |_err| (), |
1474 | ) { | ||
1421 | self.def_collector.unexpanded_macros.push(MacroDirective { | 1475 | self.def_collector.unexpanded_macros.push(MacroDirective { |
1422 | module_id: self.module_id, | 1476 | module_id: self.module_id, |
1423 | ast_id, | 1477 | ast_id, |
@@ -1470,11 +1524,10 @@ impl ModCollector<'_, '_> { | |||
1470 | mod tests { | 1524 | mod tests { |
1471 | use crate::{db::DefDatabase, test_db::TestDB}; | 1525 | use crate::{db::DefDatabase, test_db::TestDB}; |
1472 | use base_db::{fixture::WithFixture, SourceDatabase}; | 1526 | use base_db::{fixture::WithFixture, SourceDatabase}; |
1473 | use la_arena::Arena; | ||
1474 | 1527 | ||
1475 | use super::*; | 1528 | use super::*; |
1476 | 1529 | ||
1477 | fn do_collect_defs(db: &dyn DefDatabase, def_map: CrateDefMap) -> CrateDefMap { | 1530 | fn do_collect_defs(db: &dyn DefDatabase, def_map: DefMap) -> DefMap { |
1478 | let mut collector = DefCollector { | 1531 | let mut collector = DefCollector { |
1479 | db, | 1532 | db, |
1480 | def_map, | 1533 | def_map, |
@@ -1489,28 +1542,17 @@ mod tests { | |||
1489 | exports_proc_macros: false, | 1542 | exports_proc_macros: false, |
1490 | from_glob_import: Default::default(), | 1543 | from_glob_import: Default::default(), |
1491 | }; | 1544 | }; |
1545 | collector.seed_with_top_level(); | ||
1492 | collector.collect(); | 1546 | collector.collect(); |
1493 | collector.def_map | 1547 | collector.def_map |
1494 | } | 1548 | } |
1495 | 1549 | ||
1496 | fn do_resolve(code: &str) -> CrateDefMap { | 1550 | fn do_resolve(code: &str) -> DefMap { |
1497 | let (db, _file_id) = TestDB::with_single_file(&code); | 1551 | let (db, _file_id) = TestDB::with_single_file(&code); |
1498 | let krate = db.test_crate(); | 1552 | let krate = db.test_crate(); |
1499 | 1553 | ||
1500 | let def_map = { | 1554 | let edition = db.crate_graph()[krate].edition; |
1501 | let edition = db.crate_graph()[krate].edition; | 1555 | let def_map = DefMap::empty(krate, edition); |
1502 | let mut modules: Arena<ModuleData> = Arena::default(); | ||
1503 | let root = modules.alloc(ModuleData::default()); | ||
1504 | CrateDefMap { | ||
1505 | krate, | ||
1506 | edition, | ||
1507 | extern_prelude: FxHashMap::default(), | ||
1508 | prelude: None, | ||
1509 | root, | ||
1510 | modules, | ||
1511 | diagnostics: Vec::new(), | ||
1512 | } | ||
1513 | }; | ||
1514 | do_collect_defs(&db, def_map) | 1556 | do_collect_defs(&db, def_map) |
1515 | } | 1557 | } |
1516 | 1558 | ||