Skip to main content

rustc_type_ir/
ir_print.rs

1use std::fmt;
2
3#[cfg(feature = "nightly")]
4use crate::{AliasConst, ClosureKind};
5use crate::{
6    AliasTerm, AliasTy, Binder, CoercePredicate, Const, ExistentialProjection, ExistentialTraitRef,
7    FnSig, HostEffectClause, Interner, NormalizesTo, OutlivesClause, PatternKind, Placeholder,
8    ProjectionClause, Region, SubtypePredicate, TraitClause, TraitRef,
9};
10
11pub trait IrPrint<T> {
12    fn print(t: &T, fmt: &mut fmt::Formatter<'_>) -> fmt::Result;
13    fn print_debug(t: &T, fmt: &mut fmt::Formatter<'_>) -> fmt::Result;
14}
15
16macro_rules! define_display_via_print {
17    ($($ty:ident),+ $(,)?) => {
18        $(
19            impl<I: Interner> fmt::Display for $ty<I> {
20                fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
21                    <I as IrPrint<$ty<I>>>::print(self, fmt)
22                }
23            }
24        )*
25    }
26}
27
28macro_rules! define_debug_via_print {
29    ($($ty:ident),+ $(,)?) => {
30        $(
31            impl<I: Interner> fmt::Debug for $ty<I> {
32                fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
33                    <I as IrPrint<$ty<I>>>::print_debug(self, fmt)
34                }
35            }
36        )*
37    }
38}
39
40impl<I: Interner> fmt::Display for TraitRef<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<TraitRef<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for TraitClause<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<TraitClause<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for ExistentialTraitRef<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<ExistentialTraitRef<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for ExistentialProjection<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<ExistentialProjection<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for ProjectionClause<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<ProjectionClause<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for NormalizesTo<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<NormalizesTo<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for SubtypePredicate<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<SubtypePredicate<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for CoercePredicate<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<CoercePredicate<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for HostEffectClause<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<HostEffectClause<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for AliasTy<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<AliasTy<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for AliasTerm<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<AliasTerm<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for FnSig<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<FnSig<I>>>::print(self, fmt)
    }
}
impl<I: Interner> fmt::Display for PatternKind<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<PatternKind<I>>>::print(self, fmt)
    }
}define_display_via_print!(
41    TraitRef,
42    TraitClause,
43    ExistentialTraitRef,
44    ExistentialProjection,
45    ProjectionClause,
46    NormalizesTo,
47    SubtypePredicate,
48    CoercePredicate,
49    HostEffectClause,
50    AliasTy,
51    AliasTerm,
52    FnSig,
53    PatternKind,
54);
55
56impl<I: Interner> fmt::Debug for TraitRef<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<TraitRef<I>>>::print_debug(self, fmt)
    }
}
impl<I: Interner> fmt::Debug for ExistentialTraitRef<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<ExistentialTraitRef<I>>>::print_debug(self, fmt)
    }
}
impl<I: Interner> fmt::Debug for PatternKind<I> {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        <I as IrPrint<PatternKind<I>>>::print_debug(self, fmt)
    }
}define_debug_via_print!(TraitRef, ExistentialTraitRef, PatternKind);
57
58impl<I: Interner> fmt::Display for Region<I>
59where
60    I: IrPrint<Region<I>>,
61{
62    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
63        <I as IrPrint<Region<I>>>::print(self, fmt)
64    }
65}
66
67impl<I: Interner> fmt::Display for Const<I>
68where
69    I: IrPrint<Const<I>>,
70{
71    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
72        <I as IrPrint<Const<I>>>::print(self, fmt)
73    }
74}
75
76impl<I: Interner, T> fmt::Display for OutlivesClause<I, T>
77where
78    I: IrPrint<OutlivesClause<I, T>>,
79{
80    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
81        <I as IrPrint<OutlivesClause<I, T>>>::print(self, fmt)
82    }
83}
84
85impl<I: Interner, T> fmt::Display for Binder<I, T>
86where
87    I: IrPrint<Binder<I, T>>,
88{
89    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
90        <I as IrPrint<Binder<I, T>>>::print(self, fmt)
91    }
92}
93
94impl<I: Interner, T> fmt::Display for Placeholder<I, T>
95where
96    I: IrPrint<Placeholder<I, T>>,
97{
98    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
99        <I as IrPrint<Placeholder<I, T>>>::print(self, fmt)
100    }
101}
102
103#[cfg(feature = "nightly")]
104mod into_diag_arg_impls {
105    use rustc_error_messages::{DiagArgValue, IntoDiagArg};
106
107    use super::*;
108
109    impl<I: Interner> IntoDiagArg for TraitRef<I> {
110        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
111            self.to_string().into_diag_arg(path)
112        }
113    }
114
115    impl<I: Interner> IntoDiagArg for ExistentialTraitRef<I> {
116        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
117            self.to_string().into_diag_arg(path)
118        }
119    }
120
121    impl<I: Interner + IrPrint<Region<I>>> IntoDiagArg for Region<I> {
122        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
123            self.to_string().into_diag_arg(path)
124        }
125    }
126
127    impl<I: Interner> IntoDiagArg for AliasConst<I> {
128        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
129            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0:?}", self))
    })format!("{self:?}").into_diag_arg(path)
130        }
131    }
132
133    impl<I: Interner> IntoDiagArg for FnSig<I> {
134        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
135            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0:?}", self))
    })format!("{self:?}").into_diag_arg(path)
136        }
137    }
138
139    impl<I: Interner, T: IntoDiagArg> IntoDiagArg for Binder<I, T> {
140        fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> DiagArgValue {
141            self.skip_binder().into_diag_arg(path)
142        }
143    }
144
145    impl IntoDiagArg for ClosureKind {
146        fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
147            DiagArgValue::Str(self.as_str().into())
148        }
149    }
150}