@@ -94,7 +94,6 @@ use crate::{
94
94
pub struct DefMap {
95
95
_c : Count < Self > ,
96
96
block : Option < BlockInfo > ,
97
- root : LocalModuleId ,
98
97
modules : Arena < ModuleData > ,
99
98
krate : CrateId ,
100
99
/// The prelude module for this crate. This either comes from an import
@@ -141,7 +140,19 @@ struct BlockInfo {
141
140
/// The `BlockId` this `DefMap` was created from.
142
141
block : BlockId ,
143
142
/// 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
+ }
145
156
}
146
157
147
158
impl std:: ops:: Index < LocalModuleId > for DefMap {
@@ -231,6 +242,8 @@ pub struct ModuleData {
231
242
}
232
243
233
244
impl DefMap {
245
+ pub const ROOT : LocalModuleId = LocalModuleId :: from_raw ( la_arena:: RawIdx :: from_u32 ( 0 ) ) ;
246
+
234
247
pub ( crate ) fn crate_def_map_query ( db : & dyn DefDatabase , krate : CrateId ) -> Arc < DefMap > {
235
248
let _p = profile:: span ( "crate_def_map_query" ) . detail ( || {
236
249
db. crate_graph ( ) [ krate] . display_name . as_deref ( ) . unwrap_or_default ( ) . to_string ( )
@@ -266,7 +279,13 @@ impl DefMap {
266
279
ModuleData :: new ( ModuleOrigin :: BlockExpr { block : block. ast_id } , visibility) ;
267
280
268
281
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
+ } ) ;
270
289
271
290
let def_map = collector:: collect_defs ( db, def_map, tree_id) ;
272
291
Arc :: new ( def_map)
@@ -275,6 +294,7 @@ impl DefMap {
275
294
fn empty ( krate : CrateId , edition : Edition , module_data : ModuleData ) -> DefMap {
276
295
let mut modules: Arena < ModuleData > = Arena :: default ( ) ;
277
296
let root = modules. alloc ( module_data) ;
297
+ assert_eq ! ( root, Self :: ROOT ) ;
278
298
279
299
DefMap {
280
300
_c : Count :: new ( ) ,
@@ -289,7 +309,6 @@ impl DefMap {
289
309
proc_macro_loading_error : None ,
290
310
derive_helpers_in_scope : FxHashMap :: default ( ) ,
291
311
prelude : None ,
292
- root,
293
312
modules,
294
313
registered_attrs : Vec :: new ( ) ,
295
314
registered_tools : Vec :: new ( ) ,
@@ -339,10 +358,6 @@ impl DefMap {
339
358
self . no_std || self . no_core
340
359
}
341
360
342
- pub fn root ( & self ) -> LocalModuleId {
343
- self . root
344
- }
345
-
346
361
pub fn fn_as_proc_macro ( & self , id : FunctionId ) -> Option < ProcMacroId > {
347
362
self . fn_proc_macro_mapping . get ( & id) . copied ( )
348
363
}
@@ -377,9 +392,9 @@ impl DefMap {
377
392
}
378
393
379
394
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| {
381
396
if def_map. block . is_none ( ) {
382
- Some ( def_map. module_id ( def_map . root ) )
397
+ Some ( def_map. module_id ( Self :: ROOT ) )
383
398
} else {
384
399
None
385
400
}
@@ -439,7 +454,7 @@ impl DefMap {
439
454
}
440
455
let mut block = self . block ;
441
456
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 ) ;
443
458
if let Some ( it) = f ( & parent, block_info. parent . local_id ) {
444
459
return Some ( it) ;
445
460
}
@@ -452,15 +467,22 @@ impl DefMap {
452
467
/// If this `DefMap` is for a block expression, returns the module containing the block (which
453
468
/// might again be a block, or a module inside a block).
454
469
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 } )
456
472
}
457
473
458
474
/// Returns the module containing `local_mod`, either the parent `mod`, or the module (or block) containing
459
475
/// the block, if `self` corresponds to a block expression.
460
476
pub fn containing_module ( & self , local_mod : LocalModuleId ) -> Option < ModuleId > {
461
477
match self [ local_mod] . parent {
462
478
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
+ }
464
486
}
465
487
}
466
488
@@ -471,12 +493,12 @@ impl DefMap {
471
493
let mut arc;
472
494
let mut current_map = self ;
473
495
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 ) ;
475
497
buf. push ( '\n' ) ;
476
- arc = block. parent . def_map ( db) ;
498
+ arc = block. parent . def_map ( db, self . krate ) ;
477
499
current_map = & arc;
478
500
}
479
- go ( & mut buf, db, current_map, "crate" , current_map . root ) ;
501
+ go ( & mut buf, db, current_map, "crate" , Self :: ROOT ) ;
480
502
return buf;
481
503
482
504
fn go (
@@ -506,7 +528,7 @@ impl DefMap {
506
528
let mut current_map = self ;
507
529
while let Some ( block) = current_map. block {
508
530
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 ) ;
510
532
current_map = & arc;
511
533
}
512
534
@@ -534,7 +556,6 @@ impl DefMap {
534
556
recursion_limit : _,
535
557
krate : _,
536
558
prelude : _,
537
- root : _,
538
559
rustc_coherence_is_core : _,
539
560
no_core : _,
540
561
no_std : _,
0 commit comments