@@ -1075,7 +1075,9 @@ fn resolver_for_scope_<'db>(
10751075 if let Some ( block) = scopes. block ( scope) {
10761076 let def_map = block_def_map ( db, block) ;
10771077 let local_def_map = block. lookup ( db) . module . only_local_def_map ( db) ;
1078- r = r. push_block_scope ( def_map, local_def_map) ;
1078+ // Using `DefMap::ROOT` is okay here since inside modules other than the root,
1079+ // there can't directly be expressions.
1080+ r = r. push_block_scope ( def_map, local_def_map, DefMap :: ROOT ) ;
10791081 // FIXME: This adds as many module scopes as there are blocks, but resolving in each
10801082 // already traverses all parents, so this is O(n²). I think we could only store the
10811083 // innermost module scope instead?
@@ -1108,12 +1110,9 @@ impl<'db> Resolver<'db> {
11081110 self ,
11091111 def_map : & ' db DefMap ,
11101112 local_def_map : & ' db LocalDefMap ,
1113+ module_id : LocalModuleId ,
11111114 ) -> Resolver < ' db > {
1112- self . push_scope ( Scope :: BlockScope ( ModuleItemMap {
1113- def_map,
1114- local_def_map,
1115- module_id : DefMap :: ROOT ,
1116- } ) )
1115+ self . push_scope ( Scope :: BlockScope ( ModuleItemMap { def_map, local_def_map, module_id } ) )
11171116 }
11181117
11191118 fn push_expr_scope (
@@ -1273,7 +1272,7 @@ impl HasResolver for ModuleId {
12731272 let ( mut def_map, local_def_map) = self . local_def_map ( db) ;
12741273 let mut module_id = self . local_id ;
12751274
1276- if !self . is_block_module ( ) {
1275+ if !self . is_within_block ( ) {
12771276 return Resolver {
12781277 scopes : vec ! [ ] ,
12791278 module_scope : ModuleItemMap { def_map, local_def_map, module_id } ,
@@ -1283,18 +1282,18 @@ impl HasResolver for ModuleId {
12831282 let mut modules: SmallVec < [ _ ; 1 ] > = smallvec ! [ ] ;
12841283 while let Some ( parent) = def_map. parent ( ) {
12851284 let block_def_map = mem:: replace ( & mut def_map, parent. def_map ( db) ) ;
1286- modules . push ( block_def_map ) ;
1287- if !parent . is_block_module ( ) {
1288- module_id = parent. local_id ;
1285+ let block_module_id = mem :: replace ( & mut module_id , parent . local_id ) ;
1286+ modules . push ( ( block_def_map , block_module_id ) ) ;
1287+ if ! parent. is_within_block ( ) {
12891288 break ;
12901289 }
12911290 }
12921291 let mut resolver = Resolver {
12931292 scopes : Vec :: with_capacity ( modules. len ( ) ) ,
12941293 module_scope : ModuleItemMap { def_map, local_def_map, module_id } ,
12951294 } ;
1296- for def_map in modules. into_iter ( ) . rev ( ) {
1297- resolver = resolver. push_block_scope ( def_map, local_def_map) ;
1295+ for ( def_map, module_id ) in modules. into_iter ( ) . rev ( ) {
1296+ resolver = resolver. push_block_scope ( def_map, local_def_map, module_id ) ;
12981297 }
12991298 resolver
13001299 }
0 commit comments