rustc_infer/traits/
structural_impls.rs

1use std::fmt;
2
3use rustc_ast_ir::try_visit;
4use rustc_middle::ty::fold::{FallibleTypeFolder, TypeFoldable};
5use rustc_middle::ty::visit::{TypeVisitable, TypeVisitor};
6use rustc_middle::ty::{self, TyCtxt};
7
8use crate::traits;
9use crate::traits::project::Normalized;
10
11// Structural impls for the structs in `traits`.
12
13impl<'tcx, T: fmt::Debug> fmt::Debug for Normalized<'tcx, T> {
14    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15        write!(f, "Normalized({:?}, {:?})", self.value, self.obligations)
16    }
17}
18
19impl<'tcx, O: fmt::Debug> fmt::Debug for traits::Obligation<'tcx, O> {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        if ty::tls::with(|tcx| tcx.sess.verbose_internals()) {
22            write!(
23                f,
24                "Obligation(predicate={:?}, cause={:?}, param_env={:?}, depth={})",
25                self.predicate, self.cause, self.param_env, self.recursion_depth
26            )
27        } else {
28            write!(f, "Obligation(predicate={:?}, depth={})", self.predicate, self.recursion_depth)
29        }
30    }
31}
32
33impl<'tcx> fmt::Debug for traits::MismatchedProjectionTypes<'tcx> {
34    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35        write!(f, "MismatchedProjectionTypes({:?})", self.err)
36    }
37}
38
39///////////////////////////////////////////////////////////////////////////
40// TypeFoldable implementations.
41
42impl<'tcx, O: TypeFoldable<TyCtxt<'tcx>>> TypeFoldable<TyCtxt<'tcx>>
43    for traits::Obligation<'tcx, O>
44{
45    fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
46        self,
47        folder: &mut F,
48    ) -> Result<Self, F::Error> {
49        Ok(traits::Obligation {
50            cause: self.cause,
51            recursion_depth: self.recursion_depth,
52            predicate: self.predicate.try_fold_with(folder)?,
53            param_env: self.param_env.try_fold_with(folder)?,
54        })
55    }
56}
57
58impl<'tcx, O: TypeVisitable<TyCtxt<'tcx>>> TypeVisitable<TyCtxt<'tcx>>
59    for traits::Obligation<'tcx, O>
60{
61    fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
62        try_visit!(self.predicate.visit_with(visitor));
63        self.param_env.visit_with(visitor)
64    }
65}