Change:
E.g. becomes Specifically, the syntax contexts of and are linked (the s refer to the same identifier, even with hygiene) but this is not represented in the output at all, so one might interpret them as being distinct identifiers.
There is no more pretty=hygene, was it replaced with something?
Closing. is apparently no longer a thing, and the output looks sufficiently different with that I don't think it's the same.
There is a FIXME related to this issue, Now that the issue is closed can the FIXME be fix, or made more specific?
Looks like is a thing though so reopening... output today is below. I'm not completely sure whether this is fixed or not --- the output looks the same for the two s, I guess? Not sure which are being referred to either...

Discussion:
} fn post(&self, s: &mut pprust::State<'_>, node: pprust::AnnNode<'_>) { match node { <ins> pprust::AnnNode::Crate(_) | </ins> pprust::AnnNode::Ident(_) | pprust::AnnNode::Name(_) => {},

match node { pprust::AnnNode::Ident(&ast::Ident { name, span }) => { s.s.space(); <del> // FIXME #16420: this doesn't display the connections // between syntax contexts </del> s.synth_comment(format!("{}{:?}", name.as_u32(), span.ctxt())) } pprust::AnnNode::Name(&name) => { s.s.space(); s.synth_comment(name.as_u32().to_string()) } <ins> 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(); } </ins> _ => {} } }

), /// A macro invocation. /// <del> /// E.g., `macro_rules! foo { .. }` or `foo!(..)`. </del> <ins> /// E.g., `foo!(..)`. </ins> Mac(Mac), /// A macro definition.

SubItem(ast::NodeId), Expr(&'a ast::Expr), Pat(&'a ast::Pat), <ins> Crate(&'a ast::Crate), </ins> } pub trait PpAnn {

s.print_mod(&krate.module, &krate.attrs); s.print_remaining_comments(); <ins> s.ann.post(&mut s, AnnNode::Crate(krate)); </ins> s.s.eof() }

} } ast::ItemKind::MacroDef(ref macro_def) => { <del> let (kw, has_bang) = if macro_def.legacy { ("macro_rules", true) } else { ("macro", false) }; </del> <ins> let (kw, has_bang) = if macro_def.legacy { ("macro_rules", true) } else { self.print_visibility(&item.vis); ("macro", false) }; </ins> self.print_mac_common( Some(MacHeader::Keyword(kw)), has_bang,

})) } <ins> 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("nnSyntaxContexts:"); 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 } }) } </ins> impl SyntaxContext { #[inline] pub const fn root() -> Self {

#![feature(decl_macro)] <del> macro mac { ($ arg : expr) => { $ arg + $ arg } } </del> <ins> pub(crate) macro mac { ($ arg : expr) => { $ arg + $ arg } } </ins> fn main() { }

fn bar /* 0#0 */() { let x /* 0#0 */ = 1; y /* 0#1 */ + x /* 0#0 */ } fn y /* 0#0 */() { } <ins> /* 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) */ </ins>