diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-01-11 23:00:37 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-01-11 23:00:37 +0000 |
commit | 86d2af9f7b3f6af2ea9e4eca2584aa501b60aa14 (patch) | |
tree | e5ae070838d2ecbb3bb71efad06a2927e42dde70 /crates/ra_hir_ty | |
parent | bcfd297f4910bbf2305ec859d7cf42b7dca25f57 (diff) | |
parent | 9dc1826cfaa75983a83f9eb7f788067d5dedf5a7 (diff) |
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 <[email protected]>
Diffstat (limited to 'crates/ra_hir_ty')
-rw-r--r-- | crates/ra_hir_ty/src/tests/regression.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/crates/ra_hir_ty/src/tests/regression.rs b/crates/ra_hir_ty/src/tests/regression.rs index 6c5d39549..aa948dcbf 100644 --- a/crates/ra_hir_ty/src/tests/regression.rs +++ b/crates/ra_hir_ty/src/tests/regression.rs | |||
@@ -2,6 +2,8 @@ use insta::assert_snapshot; | |||
2 | use test_utils::covers; | 2 | use test_utils::covers; |
3 | 3 | ||
4 | use super::infer; | 4 | use super::infer; |
5 | use crate::test_db::TestDB; | ||
6 | use ra_db::fixture::WithFixture; | ||
5 | 7 | ||
6 | #[test] | 8 | #[test] |
7 | fn bug_484() { | 9 | fn bug_484() { |
@@ -399,3 +401,55 @@ fn test() { | |||
399 | "### | 401 | "### |
400 | ); | 402 | ); |
401 | } | 403 | } |
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 | } | ||