@@ -94,7 +94,6 @@ use crate::{
9494pub struct DefMap {
9595 _c : Count < Self > ,
9696 block : Option < BlockInfo > ,
97- root : LocalModuleId ,
9897 modules : Arena < ModuleData > ,
9998 krate : CrateId ,
10099 /// The prelude module for this crate. This either comes from an import
@@ -141,7 +140,19 @@ struct BlockInfo {
141140 /// The `BlockId` this `DefMap` was created from.
142141 block : BlockId ,
143142 /// The containing module.
144- parent : ModuleId ,
143+ parent : BlockRelativeModuleId ,
144+ }
145+
146+ #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
147+ struct BlockRelativeModuleId {
148+ block : Option < BlockId > ,
149+ local_id : LocalModuleId ,
150+ }
151+
152+ impl BlockRelativeModuleId {
153+ fn def_map ( self , db : & dyn DefDatabase , krate : CrateId ) -> Arc < DefMap > {
154+ ModuleId { krate, block : self . block , local_id : self . local_id } . def_map ( db)
155+ }
145156}
146157
147158impl std:: ops:: Index < LocalModuleId > for DefMap {
@@ -231,6 +242,8 @@ pub struct ModuleData {
231242}
232243
233244impl DefMap {
245+ pub const ROOT : LocalModuleId = LocalModuleId :: from_raw ( la_arena:: RawIdx :: from_u32 ( 0 ) ) ;
246+
234247 pub ( crate ) fn crate_def_map_query ( db : & dyn DefDatabase , krate : CrateId ) -> Arc < DefMap > {
235248 let _p = profile:: span ( "crate_def_map_query" ) . detail ( || {
236249 db. crate_graph ( ) [ krate] . display_name . as_deref ( ) . unwrap_or_default ( ) . to_string ( )
@@ -266,7 +279,13 @@ impl DefMap {
266279 ModuleData :: new ( ModuleOrigin :: BlockExpr { block : block. ast_id } , visibility) ;
267280
268281 let mut def_map = DefMap :: empty ( krate, parent_map. edition , module_data) ;
269- def_map. block = Some ( BlockInfo { block : block_id, parent : block. module } ) ;
282+ def_map. block = Some ( BlockInfo {
283+ block : block_id,
284+ parent : BlockRelativeModuleId {
285+ block : block. module . block ,
286+ local_id : block. module . local_id ,
287+ } ,
288+ } ) ;
270289
271290 let def_map = collector:: collect_defs ( db, def_map, tree_id) ;
272291 Arc :: new ( def_map)
@@ -275,6 +294,7 @@ impl DefMap {
275294 fn empty ( krate : CrateId , edition : Edition , module_data : ModuleData ) -> DefMap {
276295 let mut modules: Arena < ModuleData > = Arena :: default ( ) ;
277296 let root = modules. alloc ( module_data) ;
297+ assert_eq ! ( root, Self :: ROOT ) ;
278298
279299 DefMap {
280300 _c : Count :: new ( ) ,
@@ -289,7 +309,6 @@ impl DefMap {
289309 proc_macro_loading_error : None ,
290310 derive_helpers_in_scope : FxHashMap :: default ( ) ,
291311 prelude : None ,
292- root,
293312 modules,
294313 registered_attrs : Vec :: new ( ) ,
295314 registered_tools : Vec :: new ( ) ,
@@ -339,10 +358,6 @@ impl DefMap {
339358 self . no_std || self . no_core
340359 }
341360
342- pub fn root ( & self ) -> LocalModuleId {
343- self . root
344- }
345-
346361 pub fn fn_as_proc_macro ( & self , id : FunctionId ) -> Option < ProcMacroId > {
347362 self . fn_proc_macro_mapping . get ( & id) . copied ( )
348363 }
@@ -377,9 +392,9 @@ impl DefMap {
377392 }
378393
379394 pub ( crate ) fn crate_root ( & self , db : & dyn DefDatabase ) -> ModuleId {
380- self . with_ancestor_maps ( db, self . root , & mut |def_map, _module| {
395+ self . with_ancestor_maps ( db, Self :: ROOT , & mut |def_map, _module| {
381396 if def_map. block . is_none ( ) {
382- Some ( def_map. module_id ( def_map . root ) )
397+ Some ( def_map. module_id ( Self :: ROOT ) )
383398 } else {
384399 None
385400 }
@@ -439,7 +454,7 @@ impl DefMap {
439454 }
440455 let mut block = self . block ;
441456 while let Some ( block_info) = block {
442- let parent = block_info. parent . def_map ( db) ;
457+ let parent = block_info. parent . def_map ( db, self . krate ) ;
443458 if let Some ( it) = f ( & parent, block_info. parent . local_id ) {
444459 return Some ( it) ;
445460 }
@@ -452,15 +467,22 @@ impl DefMap {
452467 /// If this `DefMap` is for a block expression, returns the module containing the block (which
453468 /// might again be a block, or a module inside a block).
454469 pub fn parent ( & self ) -> Option < ModuleId > {
455- Some ( self . block ?. parent )
470+ let BlockRelativeModuleId { block, local_id } = self . block ?. parent ;
471+ Some ( ModuleId { krate : self . krate , block, local_id } )
456472 }
457473
458474 /// Returns the module containing `local_mod`, either the parent `mod`, or the module (or block) containing
459475 /// the block, if `self` corresponds to a block expression.
460476 pub fn containing_module ( & self , local_mod : LocalModuleId ) -> Option < ModuleId > {
461477 match self [ local_mod] . parent {
462478 Some ( parent) => Some ( self . module_id ( parent) ) ,
463- None => self . block . map ( |block| block. parent ) ,
479+ None => {
480+ self . block . map (
481+ |BlockInfo { parent : BlockRelativeModuleId { block, local_id } , .. } | {
482+ ModuleId { krate : self . krate , block, local_id }
483+ } ,
484+ )
485+ }
464486 }
465487 }
466488
@@ -471,12 +493,12 @@ impl DefMap {
471493 let mut arc;
472494 let mut current_map = self ;
473495 while let Some ( block) = current_map. block {
474- go ( & mut buf, db, current_map, "block scope" , current_map . root ) ;
496+ go ( & mut buf, db, current_map, "block scope" , Self :: ROOT ) ;
475497 buf. push ( '\n' ) ;
476- arc = block. parent . def_map ( db) ;
498+ arc = block. parent . def_map ( db, self . krate ) ;
477499 current_map = & arc;
478500 }
479- go ( & mut buf, db, current_map, "crate" , current_map . root ) ;
501+ go ( & mut buf, db, current_map, "crate" , Self :: ROOT ) ;
480502 return buf;
481503
482504 fn go (
@@ -506,7 +528,7 @@ impl DefMap {
506528 let mut current_map = self ;
507529 while let Some ( block) = current_map. block {
508530 format_to ! ( buf, "{:?} in {:?}\n " , block. block, block. parent) ;
509- arc = block. parent . def_map ( db) ;
531+ arc = block. parent . def_map ( db, self . krate ) ;
510532 current_map = & arc;
511533 }
512534
@@ -534,7 +556,6 @@ impl DefMap {
534556 recursion_limit : _,
535557 krate : _,
536558 prelude : _,
537- root : _,
538559 rustc_coherence_is_core : _,
539560 no_core : _,
540561 no_std : _,
0 commit comments