Skip to content

Commit 86d2af9

Browse files
Merge #2803
2803: Fix various names, e.g. Iterator not resolving in core prelude r=matklad a=flodiebold Basically, `Iterator` is re-exported via several steps, which happened to not be resolved yet when we got to the prelude import, but since the name resolved to the reexport from `core::iter` (just to no actual items), we gave up trying to resolve it further. Maybe part of the problem is that we can have `PartialResolvedImport::Unresolved` or `PartialResolvedImport::Indeterminate` with `None` in all namespaces, and handle them differently. Fixes #2683. Co-authored-by: Florian Diebold <flodiebold@gmail.com>
2 parents bcfd297 + 9dc1826 commit 86d2af9

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

crates/ra_hir_def/src/nameres/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ where
328328
);
329329

330330
let def = res.resolved_def;
331-
if res.reached_fixedpoint == ReachedFixedPoint::No {
331+
if res.reached_fixedpoint == ReachedFixedPoint::No || def.is_none() {
332332
return PartialResolvedImport::Unresolved;
333333
}
334334

crates/ra_hir_def/src/nameres/tests/mod_resolution.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,51 @@ fn nested_module_resolution() {
5252
"###);
5353
}
5454

55+
#[test]
56+
fn nested_module_resolution_2() {
57+
let map = def_map(
58+
"
59+
//- /lib.rs
60+
mod prelude;
61+
mod iter;
62+
63+
//- /prelude.rs
64+
pub use crate::iter::Iterator;
65+
66+
//- /iter.rs
67+
pub use self::traits::Iterator;
68+
mod traits;
69+
70+
//- /iter/traits.rs
71+
pub use self::iterator::Iterator;
72+
mod iterator;
73+
74+
//- /iter/traits/iterator.rs
75+
pub trait Iterator;
76+
",
77+
);
78+
79+
assert_snapshot!(map, @r###"
80+
crate
81+
iter: t
82+
prelude: t
83+
84+
crate::iter
85+
Iterator: t
86+
traits: t
87+
88+
crate::iter::traits
89+
Iterator: t
90+
iterator: t
91+
92+
crate::iter::traits::iterator
93+
Iterator: t
94+
95+
crate::prelude
96+
Iterator: t
97+
"###);
98+
}
99+
55100
#[test]
56101
fn module_resolution_works_for_non_standard_filenames() {
57102
let map = def_map(

crates/ra_hir_ty/src/tests/regression.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use insta::assert_snapshot;
22
use test_utils::covers;
33

44
use super::infer;
5+
use crate::test_db::TestDB;
6+
use ra_db::fixture::WithFixture;
57

68
#[test]
79
fn bug_484() {
@@ -399,3 +401,55 @@ fn test() {
399401
"###
400402
);
401403
}
404+
405+
#[test]
406+
fn issue_2683_chars_impl() {
407+
let (db, pos) = TestDB::with_position(
408+
r#"
409+
//- /main.rs crate:main deps:std
410+
fn test() {
411+
let chars: std::str::Chars<'_>;
412+
(chars.next(), chars.nth(1))<|>;
413+
}
414+
415+
//- /std.rs crate:std
416+
#[prelude_import]
417+
use prelude::*;
418+
419+
pub mod prelude {
420+
pub use crate::iter::Iterator;
421+
pub use crate::option::Option;
422+
}
423+
424+
pub mod iter {
425+
pub use self::traits::Iterator;
426+
pub mod traits {
427+
pub use self::iterator::Iterator;
428+
429+
pub mod iterator {
430+
pub trait Iterator {
431+
type Item;
432+
fn next(&mut self) -> Option<Self::Item>;
433+
fn nth(&mut self, n: usize) -> Option<Self::Item> {}
434+
}
435+
}
436+
}
437+
}
438+
439+
pub mod option {
440+
pub enum Option<T> {}
441+
}
442+
443+
pub mod str {
444+
pub struct Chars<'a> {}
445+
impl<'a> Iterator for Chars<'a> {
446+
type Item = char;
447+
fn next(&mut self) -> Option<char> {}
448+
}
449+
}
450+
"#,
451+
);
452+
453+
// should be Option<char>, but currently not because of Chalk ambiguity problem
454+
assert_eq!("(Option<{unknown}>, Option<{unknown}>)", super::type_at_pos(&db, pos));
455+
}

0 commit comments

Comments
 (0)