diff --git a/compiler/rustc_driver/src/pretty.rs b/compiler/rustc_driver/src/pretty.rs index 1dcc4d147ac..38c493a920d 100644 --- a/compiler/rustc_driver/src/pretty.rs +++ b/compiler/rustc_driver/src/pretty.rs @@ -9,7 +9,7 @@ use rustc_hir_pretty as pprust_hir; use rustc_middle::hir::map as hir_map; use rustc_middle::ty::{self, TyCtxt}; use rustc_mir::util::{write_mir_graphviz, write_mir_pretty}; -use rustc_session::config::{Input, PpHirMode, PpMode, PpSourceMode}; +use rustc_session::config::{Input, PpAstTreeMode, PpHirMode, PpMode, PpSourceMode}; use rustc_session::Session; use rustc_span::symbol::Ident; use rustc_span::FileName; @@ -391,24 +391,29 @@ pub fn print_after_parsing( ) { let (src, src_name) = get_source(input, sess); - let out = if let Source(s) = ppm { - // Silently ignores an identified node. - call_with_pp_support(&s, sess, None, move |annotation| { - debug!("pretty printing source code {:?}", s); - let sess = annotation.sess(); - let parse = &sess.parse_sess; - pprust::print_crate( - sess.source_map(), - krate, - src_name, - src, - annotation.pp_ann(), - false, - parse.edition, - ) - }) - } else { - unreachable!() + let out = match ppm { + Source(s) => { + // Silently ignores an identified node. + call_with_pp_support(&s, sess, None, move |annotation| { + debug!("pretty printing source code {:?}", s); + let sess = annotation.sess(); + let parse = &sess.parse_sess; + pprust::print_crate( + sess.source_map(), + krate, + src_name, + src, + annotation.pp_ann(), + false, + parse.edition, + ) + }) + } + AstTree(PpAstTreeMode::Normal) => { + debug!("pretty printing AST tree"); + format!("{:#?}", krate) + } + _ => unreachable!(), }; write_or_print(&out, ofile); @@ -447,6 +452,11 @@ pub fn print_after_hir_lowering<'tcx>( }) } + AstTree(PpAstTreeMode::Expanded) => { + debug!("pretty-printing expanded AST"); + format!("{:#?}", krate) + } + Hir(s) => call_with_pp_support_hir(&s, tcx, move |annotation, krate| { debug!("pretty printing HIR {:?}", s); let sess = annotation.sess(); diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index a3900ebcea9..77a9a2b227c 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -2066,6 +2066,8 @@ fn parse_pretty( ("expanded", _) => Source(PpSourceMode::Expanded), ("expanded,identified", _) => Source(PpSourceMode::ExpandedIdentified), ("expanded,hygiene", _) => Source(PpSourceMode::ExpandedHygiene), + ("ast-tree", true) => AstTree(PpAstTreeMode::Normal), + ("ast-tree,expanded", true) => AstTree(PpAstTreeMode::Expanded), ("hir", true) => Hir(PpHirMode::Normal), ("hir,identified", true) => Hir(PpHirMode::Identified), ("hir,typed", true) => Hir(PpHirMode::Typed), @@ -2080,8 +2082,8 @@ fn parse_pretty( "argument to `unpretty` must be one of `normal`, \ `expanded`, `identified`, `expanded,identified`, \ `expanded,hygiene`, `everybody_loops`, \ - `hir`, `hir,identified`, `hir,typed`, `hir-tree`, \ - `mir` or `mir-cfg`; got {}", + `ast-tree`, `ast-tree,expanded`, `hir`, `hir,identified`, \ + `hir,typed`, `hir-tree`, `mir` or `mir-cfg`; got {}", name ), ); @@ -2233,6 +2235,14 @@ pub enum PpSourceMode { ExpandedHygiene, } +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum PpAstTreeMode { + /// `-Zunpretty=ast` + Normal, + /// `-Zunpretty=ast,expanded` + Expanded, +} + #[derive(Copy, Clone, PartialEq, Debug)] pub enum PpHirMode { /// `-Zunpretty=hir` @@ -2248,6 +2258,7 @@ pub enum PpMode { /// Options that print the source code, i.e. /// `--pretty` and `-Zunpretty=everybody_loops` Source(PpSourceMode), + AstTree(PpAstTreeMode), /// Options that print the HIR, i.e. `-Zunpretty=hir` Hir(PpHirMode), /// `-Zunpretty=hir-tree` @@ -2263,9 +2274,10 @@ impl PpMode { use PpMode::*; use PpSourceMode::*; match *self { - Source(Normal | Identified) => false, + Source(Normal | Identified) | AstTree(PpAstTreeMode::Normal) => false, Source(Expanded | EveryBodyLoops | ExpandedIdentified | ExpandedHygiene) + | AstTree(PpAstTreeMode::Expanded) | Hir(_) | HirTree | Mir diff --git a/compiler/rustc_session/src/options.rs b/compiler/rustc_session/src/options.rs index e2b6b1dc243..6e7d39547a1 100644 --- a/compiler/rustc_session/src/options.rs +++ b/compiler/rustc_session/src/options.rs @@ -1158,6 +1158,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, `expanded`, `expanded,identified`, `expanded,hygiene` (with internal representations), `everybody_loops` (all function bodies replaced with `loop {}`), + `ast-tree` (raw AST before expansion), + `ast-tree,expanded` (raw AST after expansion), `hir` (the HIR), `hir,identified`, `hir,typed` (HIR with types for each node), `hir-tree` (dump the raw HIR),