mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
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:
parent
ea413f67a8
commit
9b8c5cfb0c
@ -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() {
|
||||
|
@ -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
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user