Skip to content

Commit 94d119f

Browse files
committed
fix: resolve extern prelude for local mods in block modules
1 parent 9bc6873 commit 94d119f

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

crates/hir-def/src/nameres.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use itertools::Itertools;
6767
use la_arena::Arena;
6868
use rustc_hash::{FxHashMap, FxHashSet};
6969
use span::{Edition, FileAstId, ROOT_ERASED_FILE_AST_ID};
70-
use stdx::format_to;
70+
use stdx::{format_to, IsNoneOr};
7171
use syntax::{ast, SmolStr};
7272
use triomphe::Arc;
7373
use tt::TextRange;
@@ -478,6 +478,10 @@ impl DefMap {
478478
CrateRootModuleId { krate: self.krate }
479479
}
480480

481+
pub fn is_root_block_in_module(&self) -> bool {
482+
self.block.is_none_or(|block| !block.parent.is_block_module())
483+
}
484+
481485
/// This is the same as [`Self::crate_root`] for crate def maps, but for block def maps, it
482486
/// returns the root block module.
483487
pub fn root_module_id(&self) -> ModuleId {

crates/hir-def/src/nameres/collector.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ impl DefCollector<'_> {
395395
.cfg()
396396
.map_or(true, |cfg| self.cfg_options.check(&cfg) != Some(false));
397397
if is_cfg_enabled {
398+
self.inject_prelude();
399+
398400
ModCollector {
399401
def_collector: self,
400402
macro_depth: 0,

crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ impl DefMap {
470470
};
471471

472472
let extern_prelude = || {
473-
if self.block.is_some() {
473+
if self.block.is_some() && !self.is_root_block_in_module() {
474474
// Don't resolve extern prelude in block `DefMap`s, defer it to the crate def map so
475475
// that blocks can properly shadow them
476476
return PerNs::none();
@@ -515,7 +515,7 @@ impl DefMap {
515515
None => self[Self::ROOT].scope.get(name),
516516
};
517517
let from_extern_prelude = || {
518-
if self.block.is_some() {
518+
if self.block.is_some() && !self.is_root_block_in_module() {
519519
// Don't resolve extern prelude in block `DefMap`s.
520520
return PerNs::none();
521521
}

0 commit comments

Comments
 (0)