Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 07baa17

Browse files
committed
Auto merge of rust-lang#14828 - lowr:fix/macro_use_prelude_is_in_scope, r=Veykril
fix: process `macro_use` prelude in semantic scope resolver Fixes rust-lang#14826
2 parents b7b026b + 68a74de commit 07baa17

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed

crates/hir-def/src/find_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ fn find_path_for_module(
183183

184184
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
185185
let root_def_map = crate_root.def_map(db);
186-
for (name, &def_id) in root_def_map.extern_prelude() {
186+
for (name, def_id) in root_def_map.extern_prelude() {
187187
if module_id == def_id {
188188
let name = scope_name.unwrap_or_else(|| name.clone());
189189

crates/hir-def/src/nameres.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,12 @@ impl DefMap {
355355
self.prelude
356356
}
357357

358-
pub(crate) fn extern_prelude(&self) -> impl Iterator<Item = (&Name, &ModuleId)> + '_ {
359-
self.extern_prelude.iter()
358+
pub(crate) fn extern_prelude(&self) -> impl Iterator<Item = (&Name, ModuleId)> + '_ {
359+
self.extern_prelude.iter().map(|(name, def)| (name, *def))
360+
}
361+
362+
pub(crate) fn macro_use_prelude(&self) -> impl Iterator<Item = (&Name, MacroId)> + '_ {
363+
self.macro_use_prelude.iter().map(|(name, def)| (name, *def))
360364
}
361365

362366
pub fn module_id(&self, local_id: LocalModuleId) -> ModuleId {

crates/hir-def/src/resolver.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,10 @@ impl Resolver {
461461
res.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)));
462462
})
463463
});
464-
def_map.extern_prelude().for_each(|(name, &def)| {
464+
def_map.macro_use_prelude().for_each(|(name, def)| {
465+
res.add(name, ScopeDef::ModuleDef(def.into()));
466+
});
467+
def_map.extern_prelude().for_each(|(name, def)| {
465468
res.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
466469
});
467470
BUILTIN_SCOPE.iter().for_each(|(name, &def)| {

crates/ide-completion/src/tests/flyimport.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,3 +1265,24 @@ macro_rules! define_struct {
12651265
"#]],
12661266
);
12671267
}
1268+
1269+
#[test]
1270+
fn macro_use_prelude_is_in_scope() {
1271+
check(
1272+
r#"
1273+
//- /main.rs crate:main deps:dep
1274+
#[macro_use]
1275+
extern crate dep;
1276+
1277+
fn main() {
1278+
print$0
1279+
}
1280+
//- /lib.rs crate:dep
1281+
#[macro_export]
1282+
macro_rules! println {
1283+
() => {}
1284+
}
1285+
"#,
1286+
expect![""],
1287+
)
1288+
}

0 commit comments

Comments
 (0)