Skip to content

Commit 6873920

Browse files
find_path: check only crate-level prelude
1 parent b5b4a1f commit 6873920

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

crates/hir_def/src/find_path.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,17 @@ fn find_path_inner(
130130
}
131131

132132
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
133-
for (name, def_id) in root.def_map(db).extern_prelude() {
133+
let root_def_map = root.def_map(db);
134+
for (name, def_id) in root_def_map.extern_prelude() {
134135
if item == ItemInNs::Types(*def_id) {
135136
let name = scope_name.unwrap_or_else(|| name.clone());
136137
return Some(ModPath::from_segments(PathKind::Plain, vec![name]));
137138
}
138139
}
139140

140141
// - if the item is in the prelude, return the name from there
141-
if let Some(prelude_module) = def_map.prelude() {
142+
if let Some(prelude_module) = root_def_map.prelude() {
143+
// Preludes in block DefMaps are ignored, only the crate DefMap is searched
142144
let prelude_def_map = prelude_module.def_map(db);
143145
let prelude_scope: &crate::item_scope::ItemScope =
144146
&prelude_def_map[prelude_module.local_id].scope;
@@ -1057,4 +1059,28 @@ fn f() {
10571059
"dep",
10581060
);
10591061
}
1062+
1063+
#[test]
1064+
fn prelude_with_inner_items() {
1065+
check_found_path(
1066+
r#"
1067+
//- /main.rs crate:main deps:std
1068+
fn f() {
1069+
fn inner() {}
1070+
$0
1071+
}
1072+
//- /std.rs crate:std
1073+
pub mod prelude {
1074+
pub enum Option { None }
1075+
pub use Option::*;
1076+
}
1077+
#[prelude_import]
1078+
pub use prelude::*;
1079+
"#,
1080+
"None",
1081+
"None",
1082+
"None",
1083+
"None",
1084+
);
1085+
}
10601086
}

0 commit comments

Comments
 (0)