@@ -18,7 +18,9 @@ use crate::{
1818 db:: DefDatabase ,
1919 item_scope:: { ImportOrExternCrate , BUILTIN_SCOPE } ,
2020 item_tree:: Fields ,
21- nameres:: { sub_namespace_match, BlockInfo , BuiltinShadowMode , DefMap , MacroSubNs } ,
21+ nameres:: {
22+ sub_namespace_match, BlockInfo , BuiltinShadowMode , DefMap , MacroSubNs , ModuleOrigin ,
23+ } ,
2224 path:: { ModPath , PathKind } ,
2325 per_ns:: PerNs ,
2426 visibility:: { RawVisibility , Visibility } ,
@@ -221,7 +223,7 @@ impl DefMap {
221223 None => return ResolvePathResult :: empty ( ReachedFixedPoint :: Yes ) ,
222224 } ;
223225 tracing:: debug!( "resolving {:?} in crate root (+ extern prelude)" , segment) ;
224- self . resolve_name_in_crate_root_or_extern_prelude ( db, segment)
226+ self . resolve_name_in_crate_root_or_extern_prelude ( db, original_module , segment)
225227 }
226228 PathKind :: Plain => {
227229 let ( _, segment) = match segments. next ( ) {
@@ -470,9 +472,9 @@ impl DefMap {
470472 } ;
471473
472474 let extern_prelude = || {
473- if self . block . is_some ( ) {
474- // Don't resolve extern prelude in block `DefMap`s, defer it to the crate def map so
475- // that blocks can properly shadow them
475+ if matches ! ( self [ module ] . origin , ModuleOrigin :: BlockExpr { .. } ) {
476+ // Don't resolve extern prelude in pseudo-modules of blocks, because
477+ // they might been shadowed by local names.
476478 return PerNs :: none ( ) ;
477479 }
478480 self . data . extern_prelude . get ( name) . map_or ( PerNs :: none ( ) , |& ( it, extern_crate) | {
@@ -505,6 +507,7 @@ impl DefMap {
505507 fn resolve_name_in_crate_root_or_extern_prelude (
506508 & self ,
507509 db : & dyn DefDatabase ,
510+ module : LocalModuleId ,
508511 name : & Name ,
509512 ) -> PerNs {
510513 let from_crate_root = match self . block {
@@ -515,8 +518,8 @@ impl DefMap {
515518 None => self [ Self :: ROOT ] . scope . get ( name) ,
516519 } ;
517520 let from_extern_prelude = || {
518- if self . block . is_some ( ) {
519- // Don't resolve extern prelude in block `DefMap`s .
521+ if matches ! ( self [ module ] . origin , ModuleOrigin :: BlockExpr { .. } ) {
522+ // Don't resolve extern prelude in pseudo-module of a block .
520523 return PerNs :: none ( ) ;
521524 }
522525 self . data . extern_prelude . get ( name) . copied ( ) . map_or (
0 commit comments