diff --git a/crates/ide_assists/src/handlers/add_missing_impl_members.rs b/crates/ide_assists/src/handlers/add_missing_impl_members.rs index 8225ae22c6a..59d5f48301b 100644 --- a/crates/ide_assists/src/handlers/add_missing_impl_members.rs +++ b/crates/ide_assists/src/handlers/add_missing_impl_members.rs @@ -812,4 +812,39 @@ impl Foo for () { "#, ) } + + #[test] + fn does_not_requalify_self_as_crate() { + check_assist( + add_missing_default_members, + r" +struct Wrapper(T); + +trait T { + fn f(self) -> Wrapper { + Wrapper(self) + } +} + +impl T for () { + $0 +} +", + r" +struct Wrapper(T); + +trait T { + fn f(self) -> Wrapper { + Wrapper(self) + } +} + +impl T for () { + $0fn f(self) -> Wrapper { + Wrapper(self) + } +} +", + ); + } } diff --git a/crates/ide_db/src/path_transform.rs b/crates/ide_db/src/path_transform.rs index f3d7aa920c0..32eb98714b1 100644 --- a/crates/ide_db/src/path_transform.rs +++ b/crates/ide_db/src/path_transform.rs @@ -101,8 +101,11 @@ impl<'a> Ctx<'a> { if path.qualifier().is_some() { return None; } - if path.segment().and_then(|s| s.param_list()).is_some() { + if path.segment().map_or(false, |s| { + s.param_list().is_some() || (s.self_token().is_some() && path.parent_path().is_none()) + }) { // don't try to qualify `Fn(Foo) -> Bar` paths, they are in prelude anyway + // don't try to qualify sole `self` either, they are usually locals, but are returned as modules due to namespace classing return None; }