diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index c4d3ad946f9f6..fa9504e22019e 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -326,6 +326,7 @@ impl<'hir> pprust::PpAnn for IdentifiedAnnotation<'hir> { } fn post(&self, s: &mut pprust::State<'_>, node: pprust::AnnNode<'_>) { match node { + pprust::AnnNode::Crate(_) | pprust::AnnNode::Ident(_) | pprust::AnnNode::Name(_) => {}, @@ -431,14 +432,18 @@ impl<'a> pprust::PpAnn for HygieneAnnotation<'a> { match node { pprust::AnnNode::Ident(&ast::Ident { name, span }) => { s.s.space(); - // FIXME #16420: this doesn't display the connections - // between syntax contexts s.synth_comment(format!("{}{:?}", name.as_u32(), span.ctxt())) } pprust::AnnNode::Name(&name) => { s.s.space(); s.synth_comment(name.as_u32().to_string()) } + pprust::AnnNode::Crate(_) => { + s.s.hardbreak(); + let verbose = self.sess.verbose(); + s.synth_comment(syntax_pos::hygiene::debug_hygiene_data(verbose)); + s.s.hardbreak_if_not_bol(); + } _ => {} } } diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index bcbc0a19ce768..b634dcca7fca2 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -2387,7 +2387,7 @@ pub enum ItemKind { ), /// A macro invocation. /// - /// E.g., `macro_rules! foo { .. }` or `foo!(..)`. + /// E.g., `foo!(..)`. Mac(Mac), /// A macro definition. diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 5d8498f8b5d26..bf36c0d2f5658 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -35,6 +35,7 @@ pub enum AnnNode<'a> { SubItem(ast::NodeId), Expr(&'a ast::Expr), Pat(&'a ast::Pat), + Crate(&'a ast::Crate), } pub trait PpAnn { @@ -140,6 +141,7 @@ pub fn print_crate<'a>(cm: &'a SourceMap, s.print_mod(&krate.module, &krate.attrs); s.print_remaining_comments(); + s.ann.post(&mut s, AnnNode::Crate(krate)); s.s.eof() } @@ -1369,8 +1371,12 @@ impl<'a> State<'a> { } } ast::ItemKind::MacroDef(ref macro_def) => { - let (kw, has_bang) = - if macro_def.legacy { ("macro_rules", true) } else { ("macro", false) }; + let (kw, has_bang) = if macro_def.legacy { + ("macro_rules", true) + } else { + self.print_visibility(&item.vis); + ("macro", false) + }; self.print_mac_common( Some(MacHeader::Keyword(kw)), has_bang, diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 8971638d0ffe0..e28d93267579a 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -343,6 +343,38 @@ pub fn update_dollar_crate_names(mut get_name: impl FnMut(SyntaxContext) -> Symb })) } +pub fn debug_hygiene_data(verbose: bool) -> String { + HygieneData::with(|data| { + if verbose { + format!("{:#?}", data) + } else { + let mut s = String::from(""); + s.push_str("Expansions:"); + data.expn_data.iter().enumerate().for_each(|(id, expn_info)| { + let expn_info = expn_info.as_ref().expect("no expansion data for an expansion ID"); + s.push_str(&format!( + "\n{}: parent: {:?}, call_site_ctxt: {:?}, kind: {:?}", + id, + expn_info.parent, + expn_info.call_site.ctxt(), + expn_info.kind, + )); + }); + s.push_str("\n\nSyntaxContexts:"); + data.syntax_context_data.iter().enumerate().for_each(|(id, ctxt)| { + s.push_str(&format!( + "\n#{}: parent: {:?}, outer_mark: ({:?}, {:?})", + id, + ctxt.parent, + ctxt.outer_expn, + ctxt.outer_transparency, + )); + }); + s + } + }) +} + impl SyntaxContext { #[inline] pub const fn root() -> Self { diff --git a/src/test/pretty/macro.rs b/src/test/pretty/macro.rs index 39677d1dc2da3..1e1e1dbfb3ea5 100644 --- a/src/test/pretty/macro.rs +++ b/src/test/pretty/macro.rs @@ -2,6 +2,6 @@ #![feature(decl_macro)] -macro mac { ($ arg : expr) => { $ arg + $ arg } } +pub(crate) macro mac { ($ arg : expr) => { $ arg + $ arg } } fn main() { } diff --git a/src/test/ui/hygiene/unpretty-debug.stdout b/src/test/ui/hygiene/unpretty-debug.stdout index beac4c17abf9c..6971873ba601e 100644 --- a/src/test/ui/hygiene/unpretty-debug.stdout +++ b/src/test/ui/hygiene/unpretty-debug.stdout @@ -13,3 +13,13 @@ macro_rules! foo /* 0#0 */ { ($ x : ident) => { y + $ x } } fn bar /* 0#0 */() { let x /* 0#0 */ = 1; y /* 0#1 */ + x /* 0#0 */ } fn y /* 0#0 */() { } + +/* +Expansions: +0: parent: ExpnId(0), call_site_ctxt: #0, kind: Root +1: parent: ExpnId(0), call_site_ctxt: #0, kind: Macro(Bang, foo) + +SyntaxContexts: +#0: parent: #0, outer_mark: (ExpnId(0), Opaque) +#1: parent: #0, outer_mark: (ExpnId(1), SemiTransparent) +*/