]>
Commit | Line | Data |
---|---|---|
0731742a | 1 | //! The various pretty-printing routines. |
1a4d82fc | 2 | |
f2b60f7d | 3 | use crate::session_diagnostics::UnprettyDumpFail; |
3dfed10e | 4 | use rustc_ast as ast; |
74b04a01 | 5 | use rustc_ast_pretty::pprust; |
5e7ed085 | 6 | use rustc_errors::ErrorGuaranteed; |
dfeec247 | 7 | use rustc_hir as hir; |
ba9703b0 XL |
8 | use rustc_hir_pretty as pprust_hir; |
9 | use rustc_middle::hir::map as hir_map; | |
c295e0f8 | 10 | use rustc_middle::mir::{write_mir_graphviz, write_mir_pretty}; |
ba9703b0 | 11 | use rustc_middle::ty::{self, TyCtxt}; |
9c376795 | 12 | use rustc_session::config::{PpAstTreeMode, PpHirMode, PpMode, PpSourceMode}; |
ba9703b0 | 13 | use rustc_session::Session; |
f9f354fc | 14 | use rustc_span::symbol::Ident; |
dfeec247 | 15 | use rustc_span::FileName; |
1a4d82fc | 16 | |
32a655c1 | 17 | use std::cell::Cell; |
94222f64 | 18 | use std::fmt::Write; |
1a4d82fc | 19 | |
0731742a | 20 | pub use self::PpMode::*; |
dfeec247 | 21 | pub use self::PpSourceMode::*; |
532ac7d7 XL |
22 | use crate::abort_on_err; |
23 | ||
1a4d82fc JJ |
24 | // This slightly awkward construction is to allow for each PpMode to |
25 | // choose whether it needs to do analyses (which can consume the | |
26 | // Session) and then pass through the session (now attached to the | |
27 | // analysis results) on to the chosen pretty-printer, along with the | |
28 | // `&PpAnn` object. | |
29 | // | |
30 | // Note that since the `&PrinterSupport` is freshly constructed on each | |
31 | // call, it would not make sense to try to attach the lifetime of `self` | |
32 | // to the lifetime of the `&PrinterObject`. | |
1a4d82fc | 33 | |
60c5eb7d XL |
34 | /// Constructs a `PrinterSupport` object and passes it to `f`. |
35 | fn call_with_pp_support<'tcx, A, F>( | |
36 | ppmode: &PpSourceMode, | |
37 | sess: &'tcx Session, | |
38 | tcx: Option<TyCtxt<'tcx>>, | |
39 | f: F, | |
40 | ) -> A | |
41 | where | |
42 | F: FnOnce(&dyn PrinterSupport) -> A, | |
43 | { | |
44 | match *ppmode { | |
5e7ed085 | 45 | Normal | Expanded => { |
dfeec247 | 46 | let annotation = NoAnn { sess, tcx }; |
60c5eb7d XL |
47 | f(&annotation) |
48 | } | |
1a4d82fc | 49 | |
6a06907d | 50 | Identified | ExpandedIdentified => { |
dfeec247 | 51 | let annotation = IdentifiedAnnotation { sess, tcx }; |
60c5eb7d XL |
52 | f(&annotation) |
53 | } | |
6a06907d | 54 | ExpandedHygiene => { |
dfeec247 | 55 | let annotation = HygieneAnnotation { sess }; |
60c5eb7d XL |
56 | f(&annotation) |
57 | } | |
60c5eb7d XL |
58 | } |
59 | } | |
6a06907d | 60 | fn call_with_pp_support_hir<A, F>(ppmode: &PpHirMode, tcx: TyCtxt<'_>, f: F) -> A |
60c5eb7d | 61 | where |
3c0e092e | 62 | F: FnOnce(&dyn HirPrinterSupport<'_>, hir_map::Map<'_>) -> A, |
60c5eb7d XL |
63 | { |
64 | match *ppmode { | |
6a06907d | 65 | PpHirMode::Normal => { |
dfeec247 | 66 | let annotation = NoAnn { sess: tcx.sess, tcx: Some(tcx) }; |
3c0e092e | 67 | f(&annotation, tcx.hir()) |
e9174d1e | 68 | } |
e9174d1e | 69 | |
6a06907d | 70 | PpHirMode::Identified => { |
dfeec247 | 71 | let annotation = IdentifiedAnnotation { sess: tcx.sess, tcx: Some(tcx) }; |
3c0e092e | 72 | f(&annotation, tcx.hir()) |
60c5eb7d | 73 | } |
6a06907d | 74 | PpHirMode::Typed => { |
17df50a5 | 75 | abort_on_err(tcx.analysis(()), tcx.sess); |
60c5eb7d | 76 | |
3dfed10e | 77 | let annotation = TypedAnnotation { tcx, maybe_typeck_results: Cell::new(None) }; |
3c0e092e | 78 | tcx.dep_graph.with_ignore(|| f(&annotation, tcx.hir())) |
1a4d82fc JJ |
79 | } |
80 | } | |
81 | } | |
82 | ||
32a655c1 | 83 | trait PrinterSupport: pprust::PpAnn { |
1a4d82fc JJ |
84 | /// Provides a uniform interface for re-extracting a reference to a |
85 | /// `Session` from a value that now owns it. | |
416331ca | 86 | fn sess(&self) -> &Session; |
1a4d82fc | 87 | |
1a4d82fc JJ |
88 | /// Produces the pretty-print annotation object. |
89 | /// | |
90 | /// (Rust does not yet support upcasting from a trait object to | |
c295e0f8 | 91 | /// an object for one of its supertraits.) |
ba9703b0 | 92 | fn pp_ann(&self) -> &dyn pprust::PpAnn; |
1a4d82fc JJ |
93 | } |
94 | ||
32a655c1 | 95 | trait HirPrinterSupport<'hir>: pprust_hir::PpAnn { |
e9174d1e SL |
96 | /// Provides a uniform interface for re-extracting a reference to a |
97 | /// `Session` from a value that now owns it. | |
416331ca | 98 | fn sess(&self) -> &Session; |
e9174d1e SL |
99 | |
100 | /// Provides a uniform interface for re-extracting a reference to an | |
101 | /// `hir_map::Map` from a value that now owns it. | |
ba9703b0 | 102 | fn hir_map(&self) -> Option<hir_map::Map<'hir>>; |
e9174d1e SL |
103 | |
104 | /// Produces the pretty-print annotation object. | |
105 | /// | |
106 | /// (Rust does not yet support upcasting from a trait object to | |
c295e0f8 | 107 | /// an object for one of its supertraits.) |
ba9703b0 | 108 | fn pp_ann(&self) -> &dyn pprust_hir::PpAnn; |
e9174d1e SL |
109 | } |
110 | ||
32a655c1 SL |
111 | struct NoAnn<'hir> { |
112 | sess: &'hir Session, | |
dc9dc135 | 113 | tcx: Option<TyCtxt<'hir>>, |
1a4d82fc JJ |
114 | } |
115 | ||
32a655c1 | 116 | impl<'hir> PrinterSupport for NoAnn<'hir> { |
416331ca | 117 | fn sess(&self) -> &Session { |
92a42be0 SL |
118 | self.sess |
119 | } | |
1a4d82fc | 120 | |
ba9703b0 | 121 | fn pp_ann(&self) -> &dyn pprust::PpAnn { |
92a42be0 SL |
122 | self |
123 | } | |
1a4d82fc JJ |
124 | } |
125 | ||
32a655c1 | 126 | impl<'hir> HirPrinterSupport<'hir> for NoAnn<'hir> { |
416331ca | 127 | fn sess(&self) -> &Session { |
92a42be0 SL |
128 | self.sess |
129 | } | |
e9174d1e | 130 | |
ba9703b0 XL |
131 | fn hir_map(&self) -> Option<hir_map::Map<'hir>> { |
132 | self.tcx.map(|tcx| tcx.hir()) | |
e9174d1e SL |
133 | } |
134 | ||
ba9703b0 | 135 | fn pp_ann(&self) -> &dyn pprust_hir::PpAnn { |
92a42be0 SL |
136 | self |
137 | } | |
e9174d1e SL |
138 | } |
139 | ||
32a655c1 SL |
140 | impl<'hir> pprust::PpAnn for NoAnn<'hir> {} |
141 | impl<'hir> pprust_hir::PpAnn for NoAnn<'hir> { | |
416331ca | 142 | fn nested(&self, state: &mut pprust_hir::State<'_>, nested: pprust_hir::Nested) { |
532ac7d7 | 143 | if let Some(tcx) = self.tcx { |
ba9703b0 | 144 | pprust_hir::PpAnn::nested(&(&tcx.hir() as &dyn hir::intravisit::Map<'_>), state, nested) |
32a655c1 SL |
145 | } |
146 | } | |
147 | } | |
1a4d82fc | 148 | |
32a655c1 SL |
149 | struct IdentifiedAnnotation<'hir> { |
150 | sess: &'hir Session, | |
dc9dc135 | 151 | tcx: Option<TyCtxt<'hir>>, |
1a4d82fc JJ |
152 | } |
153 | ||
32a655c1 | 154 | impl<'hir> PrinterSupport for IdentifiedAnnotation<'hir> { |
416331ca | 155 | fn sess(&self) -> &Session { |
92a42be0 SL |
156 | self.sess |
157 | } | |
1a4d82fc | 158 | |
ba9703b0 | 159 | fn pp_ann(&self) -> &dyn pprust::PpAnn { |
92a42be0 SL |
160 | self |
161 | } | |
1a4d82fc JJ |
162 | } |
163 | ||
32a655c1 | 164 | impl<'hir> pprust::PpAnn for IdentifiedAnnotation<'hir> { |
416331ca | 165 | fn pre(&self, s: &mut pprust::State<'_>, node: pprust::AnnNode<'_>) { |
ba9703b0 XL |
166 | if let pprust::AnnNode::Expr(_) = node { |
167 | s.popen(); | |
1a4d82fc JJ |
168 | } |
169 | } | |
416331ca | 170 | fn post(&self, s: &mut pprust::State<'_>, node: pprust::AnnNode<'_>) { |
1a4d82fc | 171 | match node { |
dfeec247 | 172 | pprust::AnnNode::Crate(_) | pprust::AnnNode::Ident(_) | pprust::AnnNode::Name(_) => {} |
1a4d82fc | 173 | |
b7449926 | 174 | pprust::AnnNode::Item(item) => { |
416331ca | 175 | s.s.space(); |
1a4d82fc JJ |
176 | s.synth_comment(item.id.to_string()) |
177 | } | |
b7449926 | 178 | pprust::AnnNode::SubItem(id) => { |
416331ca | 179 | s.s.space(); |
c34b1796 AL |
180 | s.synth_comment(id.to_string()) |
181 | } | |
b7449926 | 182 | pprust::AnnNode::Block(blk) => { |
416331ca | 183 | s.s.space(); |
1a4d82fc JJ |
184 | s.synth_comment(format!("block {}", blk.id)) |
185 | } | |
b7449926 | 186 | pprust::AnnNode::Expr(expr) => { |
416331ca XL |
187 | s.s.space(); |
188 | s.synth_comment(expr.id.to_string()); | |
1a4d82fc JJ |
189 | s.pclose() |
190 | } | |
b7449926 | 191 | pprust::AnnNode::Pat(pat) => { |
416331ca XL |
192 | s.s.space(); |
193 | s.synth_comment(format!("pat {}", pat.id)); | |
1a4d82fc JJ |
194 | } |
195 | } | |
196 | } | |
197 | } | |
198 | ||
32a655c1 | 199 | impl<'hir> HirPrinterSupport<'hir> for IdentifiedAnnotation<'hir> { |
416331ca | 200 | fn sess(&self) -> &Session { |
92a42be0 SL |
201 | self.sess |
202 | } | |
e9174d1e | 203 | |
ba9703b0 XL |
204 | fn hir_map(&self) -> Option<hir_map::Map<'hir>> { |
205 | self.tcx.map(|tcx| tcx.hir()) | |
e9174d1e SL |
206 | } |
207 | ||
ba9703b0 | 208 | fn pp_ann(&self) -> &dyn pprust_hir::PpAnn { |
92a42be0 SL |
209 | self |
210 | } | |
e9174d1e SL |
211 | } |
212 | ||
32a655c1 | 213 | impl<'hir> pprust_hir::PpAnn for IdentifiedAnnotation<'hir> { |
416331ca | 214 | fn nested(&self, state: &mut pprust_hir::State<'_>, nested: pprust_hir::Nested) { |
532ac7d7 | 215 | if let Some(ref tcx) = self.tcx { |
ba9703b0 | 216 | pprust_hir::PpAnn::nested(&(&tcx.hir() as &dyn hir::intravisit::Map<'_>), state, nested) |
32a655c1 SL |
217 | } |
218 | } | |
416331ca | 219 | fn pre(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) { |
ba9703b0 XL |
220 | if let pprust_hir::AnnNode::Expr(_) = node { |
221 | s.popen(); | |
e9174d1e SL |
222 | } |
223 | } | |
416331ca | 224 | fn post(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) { |
e9174d1e | 225 | match node { |
dfeec247 | 226 | pprust_hir::AnnNode::Name(_) => {} |
b7449926 | 227 | pprust_hir::AnnNode::Item(item) => { |
416331ca | 228 | s.s.space(); |
6a06907d | 229 | s.synth_comment(format!("hir_id: {}", item.hir_id())); |
e9174d1e | 230 | } |
b7449926 | 231 | pprust_hir::AnnNode::SubItem(id) => { |
416331ca XL |
232 | s.s.space(); |
233 | s.synth_comment(id.to_string()); | |
e9174d1e | 234 | } |
b7449926 | 235 | pprust_hir::AnnNode::Block(blk) => { |
416331ca XL |
236 | s.s.space(); |
237 | s.synth_comment(format!("block hir_id: {}", blk.hir_id)); | |
e9174d1e | 238 | } |
b7449926 | 239 | pprust_hir::AnnNode::Expr(expr) => { |
416331ca XL |
240 | s.s.space(); |
241 | s.synth_comment(format!("expr hir_id: {}", expr.hir_id)); | |
242 | s.pclose(); | |
e9174d1e | 243 | } |
b7449926 | 244 | pprust_hir::AnnNode::Pat(pat) => { |
416331ca XL |
245 | s.s.space(); |
246 | s.synth_comment(format!("pat hir_id: {}", pat.hir_id)); | |
247 | } | |
248 | pprust_hir::AnnNode::Arm(arm) => { | |
249 | s.s.space(); | |
250 | s.synth_comment(format!("arm hir_id: {}", arm.hir_id)); | |
e9174d1e SL |
251 | } |
252 | } | |
253 | } | |
254 | } | |
255 | ||
32a655c1 | 256 | struct HygieneAnnotation<'a> { |
dfeec247 | 257 | sess: &'a Session, |
1a4d82fc JJ |
258 | } |
259 | ||
32a655c1 SL |
260 | impl<'a> PrinterSupport for HygieneAnnotation<'a> { |
261 | fn sess(&self) -> &Session { | |
92a42be0 SL |
262 | self.sess |
263 | } | |
1a4d82fc | 264 | |
8faf50e0 | 265 | fn pp_ann(&self) -> &dyn pprust::PpAnn { |
92a42be0 SL |
266 | self |
267 | } | |
1a4d82fc JJ |
268 | } |
269 | ||
32a655c1 | 270 | impl<'a> pprust::PpAnn for HygieneAnnotation<'a> { |
416331ca | 271 | fn post(&self, s: &mut pprust::State<'_>, node: pprust::AnnNode<'_>) { |
1a4d82fc | 272 | match node { |
f9f354fc | 273 | pprust::AnnNode::Ident(&Ident { name, span }) => { |
416331ca | 274 | s.s.space(); |
83c7162d | 275 | s.synth_comment(format!("{}{:?}", name.as_u32(), span.ctxt())) |
1a4d82fc | 276 | } |
b7449926 | 277 | pprust::AnnNode::Name(&name) => { |
416331ca | 278 | s.s.space(); |
476ff2be | 279 | s.synth_comment(name.as_u32().to_string()) |
1a4d82fc | 280 | } |
e1599b0c XL |
281 | pprust::AnnNode::Crate(_) => { |
282 | s.s.hardbreak(); | |
283 | let verbose = self.sess.verbose(); | |
dfeec247 | 284 | s.synth_comment(rustc_span::hygiene::debug_hygiene_data(verbose)); |
e1599b0c XL |
285 | s.s.hardbreak_if_not_bol(); |
286 | } | |
416331ca | 287 | _ => {} |
1a4d82fc JJ |
288 | } |
289 | } | |
290 | } | |
291 | ||
f035d41b | 292 | struct TypedAnnotation<'tcx> { |
dc9dc135 | 293 | tcx: TyCtxt<'tcx>, |
3dfed10e | 294 | maybe_typeck_results: Cell<Option<&'tcx ty::TypeckResults<'tcx>>>, |
1a4d82fc JJ |
295 | } |
296 | ||
f035d41b | 297 | impl<'tcx> HirPrinterSupport<'tcx> for TypedAnnotation<'tcx> { |
416331ca | 298 | fn sess(&self) -> &Session { |
c295e0f8 | 299 | self.tcx.sess |
92a42be0 | 300 | } |
1a4d82fc | 301 | |
ba9703b0 XL |
302 | fn hir_map(&self) -> Option<hir_map::Map<'tcx>> { |
303 | Some(self.tcx.hir()) | |
1a4d82fc JJ |
304 | } |
305 | ||
ba9703b0 | 306 | fn pp_ann(&self) -> &dyn pprust_hir::PpAnn { |
92a42be0 SL |
307 | self |
308 | } | |
1a4d82fc JJ |
309 | } |
310 | ||
f035d41b | 311 | impl<'tcx> pprust_hir::PpAnn for TypedAnnotation<'tcx> { |
416331ca | 312 | fn nested(&self, state: &mut pprust_hir::State<'_>, nested: pprust_hir::Nested) { |
3dfed10e | 313 | let old_maybe_typeck_results = self.maybe_typeck_results.get(); |
32a655c1 | 314 | if let pprust_hir::Nested::Body(id) = nested { |
3dfed10e | 315 | self.maybe_typeck_results.set(Some(self.tcx.typeck_body(id))); |
32a655c1 | 316 | } |
ba9703b0 XL |
317 | let pp_ann = &(&self.tcx.hir() as &dyn hir::intravisit::Map<'_>); |
318 | pprust_hir::PpAnn::nested(pp_ann, state, nested); | |
3dfed10e | 319 | self.maybe_typeck_results.set(old_maybe_typeck_results); |
32a655c1 | 320 | } |
416331ca | 321 | fn pre(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) { |
ba9703b0 XL |
322 | if let pprust_hir::AnnNode::Expr(_) = node { |
323 | s.popen(); | |
1a4d82fc JJ |
324 | } |
325 | } | |
416331ca | 326 | fn post(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) { |
ba9703b0 | 327 | if let pprust_hir::AnnNode::Expr(expr) = node { |
136023e0 XL |
328 | let typeck_results = self.maybe_typeck_results.get().or_else(|| { |
329 | self.tcx | |
330 | .hir() | |
2b03887a | 331 | .maybe_body_owned_by(expr.hir_id.owner.def_id) |
136023e0 XL |
332 | .map(|body_id| self.tcx.typeck_body(body_id)) |
333 | }); | |
334 | ||
335 | if let Some(typeck_results) = typeck_results { | |
336 | s.s.space(); | |
337 | s.s.word("as"); | |
338 | s.s.space(); | |
339 | s.s.word(typeck_results.expr_ty(expr).to_string()); | |
340 | } | |
341 | ||
ba9703b0 | 342 | s.pclose(); |
1a4d82fc JJ |
343 | } |
344 | } | |
345 | } | |
346 | ||
9c376795 FG |
347 | fn get_source(sess: &Session) -> (String, FileName) { |
348 | let src_name = sess.io.input.source_name(); | |
5869c6ff | 349 | let src = String::clone( |
c295e0f8 | 350 | sess.source_map() |
5869c6ff XL |
351 | .get_source_file(&src_name) |
352 | .expect("get_source_file") | |
353 | .src | |
354 | .as_ref() | |
355 | .expect("src"), | |
356 | ); | |
a7813a04 XL |
357 | (src, src_name) |
358 | } | |
359 | ||
9c376795 FG |
360 | fn write_or_print(out: &str, sess: &Session) { |
361 | match &sess.io.output_file { | |
362 | None => print!("{out}"), | |
6a06907d XL |
363 | Some(p) => { |
364 | if let Err(e) = std::fs::write(p, out) { | |
f2b60f7d FG |
365 | sess.emit_fatal(UnprettyDumpFail { |
366 | path: p.display().to_string(), | |
367 | err: e.to_string(), | |
368 | }); | |
6a06907d XL |
369 | } |
370 | } | |
a7813a04 XL |
371 | } |
372 | } | |
1a4d82fc | 373 | |
9c376795 FG |
374 | pub fn print_after_parsing(sess: &Session, krate: &ast::Crate, ppm: PpMode) { |
375 | let (src, src_name) = get_source(sess); | |
a7813a04 | 376 | |
6a06907d XL |
377 | let out = match ppm { |
378 | Source(s) => { | |
379 | // Silently ignores an identified node. | |
380 | call_with_pp_support(&s, sess, None, move |annotation| { | |
381 | debug!("pretty printing source code {:?}", s); | |
382 | let sess = annotation.sess(); | |
383 | let parse = &sess.parse_sess; | |
384 | pprust::print_crate( | |
385 | sess.source_map(), | |
386 | krate, | |
387 | src_name, | |
388 | src, | |
389 | annotation.pp_ann(), | |
390 | false, | |
391 | parse.edition, | |
f2b60f7d | 392 | &sess.parse_sess.attr_id_generator, |
6a06907d XL |
393 | ) |
394 | }) | |
395 | } | |
396 | AstTree(PpAstTreeMode::Normal) => { | |
397 | debug!("pretty printing AST tree"); | |
9c376795 | 398 | format!("{krate:#?}") |
6a06907d XL |
399 | } |
400 | _ => unreachable!(), | |
a7813a04 XL |
401 | }; |
402 | ||
9c376795 | 403 | write_or_print(&out, sess); |
a7813a04 XL |
404 | } |
405 | ||
9ffffee4 | 406 | pub fn print_after_hir_lowering<'tcx>(tcx: TyCtxt<'tcx>, ppm: PpMode) { |
a7813a04 | 407 | if ppm.needs_analysis() { |
9c376795 | 408 | abort_on_err(print_with_analysis(tcx, ppm), tcx.sess); |
a7813a04 XL |
409 | return; |
410 | } | |
411 | ||
9c376795 | 412 | let (src, src_name) = get_source(tcx.sess); |
a7813a04 | 413 | |
6a06907d XL |
414 | let out = match ppm { |
415 | Source(s) => { | |
dfeec247 | 416 | // Silently ignores an identified node. |
dfeec247 XL |
417 | call_with_pp_support(&s, tcx.sess, Some(tcx), move |annotation| { |
418 | debug!("pretty printing source code {:?}", s); | |
419 | let sess = annotation.sess(); | |
74b04a01 | 420 | let parse = &sess.parse_sess; |
6a06907d | 421 | pprust::print_crate( |
dfeec247 | 422 | sess.source_map(), |
9ffffee4 | 423 | &tcx.resolver_for_lowering(()).borrow().1, |
dfeec247 XL |
424 | src_name, |
425 | src, | |
426 | annotation.pp_ann(), | |
427 | true, | |
74b04a01 | 428 | parse.edition, |
f2b60f7d | 429 | &sess.parse_sess.attr_id_generator, |
dfeec247 XL |
430 | ) |
431 | }) | |
432 | } | |
e9174d1e | 433 | |
6a06907d XL |
434 | AstTree(PpAstTreeMode::Expanded) => { |
435 | debug!("pretty-printing expanded AST"); | |
9ffffee4 | 436 | format!("{:#?}", tcx.resolver_for_lowering(()).borrow().1) |
dfeec247 | 437 | } |
ff7c6d11 | 438 | |
3c0e092e | 439 | Hir(s) => call_with_pp_support_hir(&s, tcx, move |annotation, hir_map| { |
6a06907d XL |
440 | debug!("pretty printing HIR {:?}", s); |
441 | let sess = annotation.sess(); | |
442 | let sm = sess.source_map(); | |
3c0e092e XL |
443 | let attrs = |id| hir_map.attrs(id); |
444 | pprust_hir::print_crate( | |
445 | sm, | |
446 | hir_map.root_module(), | |
447 | src_name, | |
448 | src, | |
449 | &attrs, | |
450 | annotation.pp_ann(), | |
451 | ) | |
6a06907d XL |
452 | }), |
453 | ||
3c0e092e XL |
454 | HirTree => { |
455 | call_with_pp_support_hir(&PpHirMode::Normal, tcx, move |_annotation, hir_map| { | |
456 | debug!("pretty printing HIR tree"); | |
457 | format!("{:#?}", hir_map.krate()) | |
458 | }) | |
459 | } | |
6a06907d | 460 | |
dfeec247 | 461 | _ => unreachable!(), |
6a06907d | 462 | }; |
dfeec247 | 463 | |
9c376795 | 464 | write_or_print(&out, tcx.sess); |
a7813a04 XL |
465 | } |
466 | ||
467 | // In an ideal world, this would be a public function called by the driver after | |
9fa01778 | 468 | // analysis is performed. However, we want to call `phase_3_run_analysis_passes` |
a7813a04 XL |
469 | // with a different callback than the standard driver, so that isn't easy. |
470 | // Instead, we call that function ourselves. | |
9c376795 | 471 | fn print_with_analysis(tcx: TyCtxt<'_>, ppm: PpMode) -> Result<(), ErrorGuaranteed> { |
17df50a5 | 472 | tcx.analysis(())?; |
cdc7bbd5 XL |
473 | let out = match ppm { |
474 | Mir => { | |
475 | let mut out = Vec::new(); | |
476 | write_mir_pretty(tcx, None, &mut out).unwrap(); | |
477 | String::from_utf8(out).unwrap() | |
478 | } | |
479 | ||
480 | MirCFG => { | |
481 | let mut out = Vec::new(); | |
482 | write_mir_graphviz(tcx, None, &mut out).unwrap(); | |
483 | String::from_utf8(out).unwrap() | |
484 | } | |
485 | ||
486 | ThirTree => { | |
94222f64 | 487 | let mut out = String::new(); |
2b03887a | 488 | abort_on_err(rustc_hir_analysis::check_crate(tcx), tcx.sess); |
94222f64 | 489 | debug!("pretty printing THIR tree"); |
c295e0f8 | 490 | for did in tcx.hir().body_owners() { |
94222f64 XL |
491 | let _ = writeln!( |
492 | out, | |
493 | "{:?}:\n{}\n", | |
494 | did, | |
495 | tcx.thir_tree(ty::WithOptConstParam::unknown(did)) | |
496 | ); | |
497 | } | |
498 | out | |
cdc7bbd5 XL |
499 | } |
500 | ||
9ffffee4 FG |
501 | ThirFlat => { |
502 | let mut out = String::new(); | |
503 | abort_on_err(rustc_hir_analysis::check_crate(tcx), tcx.sess); | |
504 | debug!("pretty printing THIR flat"); | |
505 | for did in tcx.hir().body_owners() { | |
506 | let _ = writeln!( | |
507 | out, | |
508 | "{:?}:\n{}\n", | |
509 | did, | |
510 | tcx.thir_flat(ty::WithOptConstParam::unknown(did)) | |
511 | ); | |
512 | } | |
513 | out | |
514 | } | |
515 | ||
532ac7d7 | 516 | _ => unreachable!(), |
cdc7bbd5 | 517 | }; |
c34b1796 | 518 | |
9c376795 | 519 | write_or_print(&out, tcx.sess); |
532ac7d7 XL |
520 | |
521 | Ok(()) | |
1a4d82fc | 522 | } |