Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #20337 from ChayimFriedman2/double-inlay-hints
fix: When displaying a projection into a type parameter that has bounds as `impl Trait`, collect only the bounds of this projection
Lukas Wirth 9 months ago
parent c12ec2e · parent 9b8c5cf · commit e57f184
-rw-r--r--crates/hir-ty/src/display.rs26
-rw-r--r--crates/ide/src/inlay_hints.rs30
2 files changed, 43 insertions, 13 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index b3760e3a38..f0e31ebd02 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -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() {
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index 19e5509681..671fddb436 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -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
+}
+ "#,
+ );
+ }
}