aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/nameres/collector.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/nameres/collector.rs')
-rw-r--r--crates/hir_def/src/nameres/collector.rs212
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};
18use hir_expand::{InFile, MacroCallLoc}; 18use hir_expand::{InFile, MacroCallLoc};
19use rustc_hash::{FxHashMap, FxHashSet}; 19use rustc_hash::{FxHashMap, FxHashSet};
@@ -24,38 +24,43 @@ use tt::{Leaf, TokenTree};
24use crate::{ 24use 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
44const GLOB_RECURSION_LIMIT: usize = 100; 46const GLOB_RECURSION_LIMIT: usize = 100;
45const EXPANSION_DEPTH_LIMIT: usize = 128; 47const EXPANSION_DEPTH_LIMIT: usize = 128;
46const FIXED_POINT_LIMIT: usize = 8192; 48const FIXED_POINT_LIMIT: usize = 8192;
47 49
48pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap { 50pub(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
211struct DefCollector<'a> { 224struct 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
230impl DefCollector<'_> { 243impl 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<'_, '_> {
1470mod tests { 1524mod 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