1use std::any::type_name_of_val;
4
5use rustc_type_ir::inherent::SliceLike;
6use rustc_type_ir::{self as ty, ir_print::IrPrint};
7
8use crate::db::HirDatabase;
9
10use super::SolverDefId;
11use super::interner::DbInterner;
12
13impl<'db> IrPrint<ty::AliasTy<Self>> for DbInterner<'db> {
14 fn print(t: &ty::AliasTy<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15 Self::print_debug(t, fmt)
16 }
17
18 fn print_debug(t: &ty::AliasTy<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19 salsa::with_attached_database(|db| match t.def_id {
20 SolverDefId::TypeAliasId(id) => fmt.write_str(&format!(
21 "AliasTy({:?}[{:?}])",
22 db.as_view::<dyn HirDatabase>().type_alias_signature(id).name.as_str(),
23 t.args
24 )),
25 SolverDefId::InternedOpaqueTyId(id) => {
26 fmt.write_str(&format!("AliasTy({:?}[{:?}])", id, t.args))
27 }
28 _ => panic!("Expected TypeAlias or OpaqueTy."),
29 })
30 .unwrap_or_else(|| fmt.write_str(&format!("AliasTy({:?}[{:?}])", t.def_id, t.args)))
31 }
32}
33
34impl<'db> IrPrint<ty::AliasTerm<Self>> for DbInterner<'db> {
35 fn print(t: &ty::AliasTerm<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36 Self::print_debug(t, fmt)
37 }
38
39 fn print_debug(t: &ty::AliasTerm<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 salsa::with_attached_database(|db| match t.def_id {
41 SolverDefId::TypeAliasId(id) => fmt.write_str(&format!(
42 "AliasTerm({:?}[{:?}])",
43 db.as_view::<dyn HirDatabase>().type_alias_signature(id).name.as_str(),
44 t.args
45 )),
46 SolverDefId::InternedOpaqueTyId(id) => {
47 fmt.write_str(&format!("AliasTerm({:?}[{:?}])", id, t.args))
48 }
49 _ => panic!("Expected TypeAlias or OpaqueTy."),
50 })
51 .unwrap_or_else(|| fmt.write_str(&format!("AliasTerm({:?}[{:?}])", t.def_id, t.args)))
52 }
53}
54impl<'db> IrPrint<ty::TraitRef<Self>> for DbInterner<'db> {
55 fn print(t: &ty::TraitRef<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56 Self::print_debug(t, fmt)
57 }
58
59 fn print_debug(t: &ty::TraitRef<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 salsa::with_attached_database(|db| {
61 let trait_ = t.def_id.0;
62 let self_ty = &t.args.as_slice()[0];
63 let trait_args = &t.args.as_slice()[1..];
64 if trait_args.is_empty() {
65 fmt.write_str(&format!(
66 "{:?}: {}",
67 self_ty,
68 db.as_view::<dyn HirDatabase>().trait_signature(trait_).name.as_str()
69 ))
70 } else {
71 fmt.write_str(&format!(
72 "{:?}: {}<{:?}>",
73 self_ty,
74 db.as_view::<dyn HirDatabase>().trait_signature(trait_).name.as_str(),
75 trait_args
76 ))
77 }
78 })
79 .unwrap_or_else(|| fmt.write_str(&format!("TraitRef({:?}[{:?}])", t.def_id, t.args)))
80 }
81}
82impl<'db> IrPrint<ty::TraitPredicate<Self>> for DbInterner<'db> {
83 fn print(t: &ty::TraitPredicate<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84 Self::print_debug(t, fmt)
85 }
86
87 fn print_debug(
88 t: &ty::TraitPredicate<Self>,
89 fmt: &mut std::fmt::Formatter<'_>,
90 ) -> std::fmt::Result {
91 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
92 }
93}
94impl<'db> IrPrint<rustc_type_ir::HostEffectPredicate<Self>> for DbInterner<'db> {
95 fn print(
96 t: &rustc_type_ir::HostEffectPredicate<Self>,
97 fmt: &mut std::fmt::Formatter<'_>,
98 ) -> std::fmt::Result {
99 Self::print_debug(t, fmt)
100 }
101
102 fn print_debug(
103 t: &rustc_type_ir::HostEffectPredicate<Self>,
104 fmt: &mut std::fmt::Formatter<'_>,
105 ) -> std::fmt::Result {
106 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
107 }
108}
109impl<'db> IrPrint<ty::ExistentialTraitRef<Self>> for DbInterner<'db> {
110 fn print(
111 t: &ty::ExistentialTraitRef<Self>,
112 fmt: &mut std::fmt::Formatter<'_>,
113 ) -> std::fmt::Result {
114 Self::print_debug(t, fmt)
115 }
116
117 fn print_debug(
118 t: &ty::ExistentialTraitRef<Self>,
119 fmt: &mut std::fmt::Formatter<'_>,
120 ) -> std::fmt::Result {
121 salsa::with_attached_database(|db| {
122 let trait_ = t.def_id.0;
123 fmt.write_str(&format!(
124 "ExistentialTraitRef({:?}[{:?}])",
125 db.as_view::<dyn HirDatabase>().trait_signature(trait_).name.as_str(),
126 t.args
127 ))
128 })
129 .unwrap_or_else(|| {
130 fmt.write_str(&format!("ExistentialTraitRef({:?}[{:?}])", t.def_id, t.args))
131 })
132 }
133}
134impl<'db> IrPrint<ty::ExistentialProjection<Self>> for DbInterner<'db> {
135 fn print(
136 t: &ty::ExistentialProjection<Self>,
137 fmt: &mut std::fmt::Formatter<'_>,
138 ) -> std::fmt::Result {
139 Self::print_debug(t, fmt)
140 }
141
142 fn print_debug(
143 t: &ty::ExistentialProjection<Self>,
144 fmt: &mut std::fmt::Formatter<'_>,
145 ) -> std::fmt::Result {
146 salsa::with_attached_database(|db| {
147 let id = match t.def_id {
148 SolverDefId::TypeAliasId(id) => id,
149 _ => panic!("Expected trait."),
150 };
151 fmt.write_str(&format!(
152 "ExistentialProjection(({:?}[{:?}]) -> {:?})",
153 db.as_view::<dyn HirDatabase>().type_alias_signature(id).name.as_str(),
154 t.args,
155 t.term
156 ))
157 })
158 .unwrap_or_else(|| {
159 fmt.write_str(&format!(
160 "ExistentialProjection(({:?}[{:?}]) -> {:?})",
161 t.def_id, t.args, t.term
162 ))
163 })
164 }
165}
166impl<'db> IrPrint<ty::ProjectionPredicate<Self>> for DbInterner<'db> {
167 fn print(
168 t: &ty::ProjectionPredicate<Self>,
169 fmt: &mut std::fmt::Formatter<'_>,
170 ) -> std::fmt::Result {
171 Self::print_debug(t, fmt)
172 }
173
174 fn print_debug(
175 t: &ty::ProjectionPredicate<Self>,
176 fmt: &mut std::fmt::Formatter<'_>,
177 ) -> std::fmt::Result {
178 salsa::with_attached_database(|db| {
179 let id = match t.projection_term.def_id {
180 SolverDefId::TypeAliasId(id) => id,
181 _ => panic!("Expected trait."),
182 };
183 fmt.write_str(&format!(
184 "ProjectionPredicate(({:?}[{:?}]) -> {:?})",
185 db.as_view::<dyn HirDatabase>().type_alias_signature(id).name.as_str(),
186 t.projection_term.args,
187 t.term
188 ))
189 })
190 .unwrap_or_else(|| {
191 fmt.write_str(&format!(
192 "ProjectionPredicate(({:?}[{:?}]) -> {:?})",
193 t.projection_term.def_id, t.projection_term.args, t.term
194 ))
195 })
196 }
197}
198impl<'db> IrPrint<ty::NormalizesTo<Self>> for DbInterner<'db> {
199 fn print(t: &ty::NormalizesTo<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
200 Self::print_debug(t, fmt)
201 }
202
203 fn print_debug(
204 t: &ty::NormalizesTo<Self>,
205 fmt: &mut std::fmt::Formatter<'_>,
206 ) -> std::fmt::Result {
207 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
208 }
209}
210impl<'db> IrPrint<ty::SubtypePredicate<Self>> for DbInterner<'db> {
211 fn print(
212 t: &ty::SubtypePredicate<Self>,
213 fmt: &mut std::fmt::Formatter<'_>,
214 ) -> std::fmt::Result {
215 Self::print_debug(t, fmt)
216 }
217
218 fn print_debug(
219 t: &ty::SubtypePredicate<Self>,
220 fmt: &mut std::fmt::Formatter<'_>,
221 ) -> std::fmt::Result {
222 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
223 }
224}
225impl<'db> IrPrint<ty::CoercePredicate<Self>> for DbInterner<'db> {
226 fn print(t: &ty::CoercePredicate<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
227 Self::print_debug(t, fmt)
228 }
229
230 fn print_debug(
231 t: &ty::CoercePredicate<Self>,
232 fmt: &mut std::fmt::Formatter<'_>,
233 ) -> std::fmt::Result {
234 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
235 }
236}
237impl<'db> IrPrint<ty::FnSig<Self>> for DbInterner<'db> {
238 fn print(t: &ty::FnSig<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
239 Self::print_debug(t, fmt)
240 }
241
242 fn print_debug(t: &ty::FnSig<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
243 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
244 }
245}
246
247impl<'db> IrPrint<rustc_type_ir::PatternKind<DbInterner<'db>>> for DbInterner<'db> {
248 fn print(
249 t: &rustc_type_ir::PatternKind<DbInterner<'db>>,
250 fmt: &mut std::fmt::Formatter<'_>,
251 ) -> std::fmt::Result {
252 Self::print_debug(t, fmt)
253 }
254
255 fn print_debug(
256 t: &rustc_type_ir::PatternKind<DbInterner<'db>>,
257 fmt: &mut std::fmt::Formatter<'_>,
258 ) -> std::fmt::Result {
259 fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
260 }
261}