Auto merge of #17251 - roife:fix-issue-17057, r=Veykril · rust-lang/rust@0916e72
@@ -221,7 +221,7 @@ impl DefMap {
221221None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
222222};
223223 tracing::debug!("resolving {:?} in crate root (+ extern prelude)", segment);
224-self.resolve_name_in_crate_root_or_extern_prelude(db, segment)
224+self.resolve_name_in_crate_root_or_extern_prelude(db, original_module, segment)
225225}
226226PathKind::Plain => {
227227let (_, segment) = match segments.next() {
@@ -470,9 +470,9 @@ impl DefMap {
470470};
471471472472let 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
473+if self.block.is_some() && module == DefMap::ROOT {
474+// Don't resolve extern prelude in pseudo-modules of blocks, because
475+// they might been shadowed by local names.
476476return PerNs::none();
477477}
478478self.data.extern_prelude.get(name).map_or(PerNs::none(), |&(it, extern_crate)| {
@@ -505,6 +505,7 @@ impl DefMap {
505505fn resolve_name_in_crate_root_or_extern_prelude(
506506&self,
507507db: &dyn DefDatabase,
508+module: LocalModuleId,
508509name: &Name,
509510) -> PerNs {
510511let from_crate_root = match self.block {
@@ -515,8 +516,8 @@ impl DefMap {
515516None => self[Self::ROOT].scope.get(name),
516517};
517518let from_extern_prelude = || {
518-if self.block.is_some() {
519-// Don't resolve extern prelude in block `DefMap`s.
519+if self.block.is_some() && module == DefMap::ROOT {
520+// Don't resolve extern prelude in pseudo-module of a block.
520521return PerNs::none();
521522}
522523self.data.extern_prelude.get(name).copied().map_or(