diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index f9747f3b34d..c5304c18218 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -1161,8 +1161,9 @@ pub(crate) fn generic_predicates_for_param_query( return false; } } - WherePredicateTypeTarget::TypeOrConstParam(local_id) => { - if *local_id != param_id.local_id { + &WherePredicateTypeTarget::TypeOrConstParam(local_id) => { + let target_id = TypeOrConstParamId { parent: def, local_id }; + if target_id != param_id { return false; } } diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index 30c67d41b71..aa8b420e980 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -466,6 +466,23 @@ fn test() { ); } +#[test] +fn associated_type_shorthand_from_self_issue_12484() { + check_types( + r#" +trait Bar { + type A; +} +trait Foo { + type A; + fn test(a: Self::A, _: impl Bar) { + a; + //^ Foo::A + } +}"#, + ); +} + #[test] fn infer_associated_type_bound() { check_types( diff --git a/crates/ide-completion/src/completions/dot.rs b/crates/ide-completion/src/completions/dot.rs index 911ef609306..727ec6e6085 100644 --- a/crates/ide-completion/src/completions/dot.rs +++ b/crates/ide-completion/src/completions/dot.rs @@ -918,4 +918,26 @@ fn main() { ", ) } + + #[test] + fn issue_12484() { + check( + r#" +//- minicore: sized +trait SizeUser { + type Size; +} +trait Closure: SizeUser {} +trait Encrypt: SizeUser { + fn encrypt(self, _: impl Closure); +} +fn test(thing: impl Encrypt) { + thing.$0; +} + "#, + expect![[r#" + me encrypt(…) (as Encrypt) fn(self, impl Closure::Size>) + "#]], + ) + } }