When displaying a projection into a type parameter that has bounds as impl Trait, collect only the bounds of this projection

It used to collect the bounds of them all.
This commit is contained in:
Chayim Refael Friedman 2025-07-29 14:40:14 +03:00
parent ea413f67a8
commit 9b8c5cfb0c
2 changed files with 43 additions and 13 deletions

View File

@ -620,19 +620,19 @@ impl HirDisplay for ProjectionTy {
.generic_predicates(id.parent)
.iter()
.map(|pred| pred.clone().substitute(Interner, &substs))
.filter(|wc| match wc.skip_binders() {
WhereClause::Implemented(tr) => {
matches!(
tr.self_type_parameter(Interner).kind(Interner),
TyKind::Alias(_)
)
}
WhereClause::TypeOutlives(t) => {
matches!(t.ty.kind(Interner), TyKind::Alias(_))
}
// We shouldn't be here if these exist
WhereClause::AliasEq(_) => false,
WhereClause::LifetimeOutlives(_) => false,
.filter(|wc| {
let ty = match wc.skip_binders() {
WhereClause::Implemented(tr) => tr.self_type_parameter(Interner),
WhereClause::TypeOutlives(t) => t.ty.clone(),
// We shouldn't be here if these exist
WhereClause::AliasEq(_) | WhereClause::LifetimeOutlives(_) => {
return false;
}
};
let TyKind::Alias(AliasTy::Projection(proj)) = ty.kind(Interner) else {
return false;
};
proj == self
})
.collect::<Vec<_>>();
if !bounds.is_empty() {

View File

@ -1065,4 +1065,34 @@ fn bar() {
"#,
);
}
#[test]
fn regression_20239() {
check_with_config(
InlayHintsConfig { parameter_hints: true, type_hints: true, ..DISABLED_CONFIG },
r#"
//- minicore: fn
trait Iterator {
type Item;
fn map<B, F: FnMut(Self::Item) -> B>(self, f: F);
}
trait ToString {
fn to_string(&self);
}
fn check_tostr_eq<L, R>(left: L, right: R)
where
L: Iterator,
L::Item: ToString,
R: Iterator,
R::Item: ToString,
{
left.map(|s| s.to_string());
// ^ impl ToString
right.map(|s| s.to_string());
// ^ impl ToString
}
"#,
);
}
}