Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/solver_errors.rs')
-rw-r--r--crates/hir-ty/src/solver_errors.rs27
1 files changed, 18 insertions, 9 deletions
diff --git a/crates/hir-ty/src/solver_errors.rs b/crates/hir-ty/src/solver_errors.rs
index e4e76fa67b..75f1de3288 100644
--- a/crates/hir-ty/src/solver_errors.rs
+++ b/crates/hir-ty/src/solver_errors.rs
@@ -29,7 +29,7 @@ pub struct SolverDiagnostic {
pub enum SolverDiagnosticKind {
TraitUnimplemented {
trait_predicate: StoredTraitPredicate,
- root_trait_predicate: Option<StoredTraitPredicate>,
+ parent_trait_predicates: Vec<StoredTraitPredicate>,
},
}
@@ -78,13 +78,22 @@ fn handle_trait_unimplemented<'db>(
polarity: trait_pred.polarity,
};
- let root_trait_predicate = match error.root_obligation.predicate.kind().skip_binder() {
- PredicateKind::Clause(ClauseKind::Trait(trait_pred)) => Some(StoredTraitPredicate {
- trait_ref: StoredTraitRef::new(trait_pred.trait_ref),
- polarity: trait_pred.polarity,
- }),
- _ => None,
- };
+ let mut parent_trait_predicates = error
+ .trait_obligation_chain
+ .iter()
+ .filter_map(|predicate| predicate.as_trait_clause())
+ .map(|trait_predicate| {
+ let trait_predicate = trait_predicate.skip_binder();
+ StoredTraitPredicate {
+ trait_ref: StoredTraitRef::new(trait_predicate.trait_ref),
+ polarity: trait_predicate.polarity,
+ }
+ })
+ .collect::<Vec<_>>();
+ if parent_trait_predicates.last() == Some(&trait_predicate) {
+ parent_trait_predicates.pop();
+ }
+ parent_trait_predicates.reverse();
- Some(SolverDiagnosticKind::TraitUnimplemented { trait_predicate, root_trait_predicate })
+ Some(SolverDiagnosticKind::TraitUnimplemented { trait_predicate, parent_trait_predicates })
}