diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-14 16:09:39 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-15 12:42:07 +0300 |
| commit | 0cdd18d0a7b9d3c52017b57eecda6e198e9512b1 (patch) | |
| tree | 11e861c4e4f4a0eea33d6068dbb2e70ff9e63fd1 /src/libsyntax | |
| parent | a2a1cd186481c49d1cde611e4f3f2a707e77eab9 (diff) | |
| download | rust-0cdd18d0a7b9d3c52017b57eecda6e198e9512b1.tar.gz rust-0cdd18d0a7b9d3c52017b57eecda6e198e9512b1.zip | |
pprust: Support `macro` macros
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 47985351f7d..16e0bace925 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -20,6 +20,11 @@ use syntax_pos::{DUMMY_SP, FileName, Span}; use std::borrow::Cow; +pub enum MacHeader<'a> { + Path(&'a ast::Path), + Keyword(&'static str), +} + pub enum AnnNode<'a> { Ident(&'a ast::Ident), Name(&'a ast::Name), @@ -620,7 +625,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM match attr.tokens.trees().next() { Some(TokenTree::Delimited(_, delim, tts)) => { self.print_mac_common( - Some(&attr.path), false, None, delim, tts, true, attr.span + Some(MacHeader::Path(&attr.path)), false, None, delim, tts, true, attr.span ); } tree => { @@ -706,7 +711,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM fn print_mac_common( &mut self, - path: Option<&ast::Path>, + header: Option<MacHeader<'_>>, has_bang: bool, ident: Option<ast::Ident>, delim: DelimToken, @@ -717,8 +722,10 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM if delim == DelimToken::Brace { self.cbox(INDENT_UNIT); } - if let Some(path) = path { - self.print_path(path, false, 0); + match header { + Some(MacHeader::Path(path)) => self.print_path(path, false, 0), + Some(MacHeader::Keyword(kw)) => self.word(kw), + None => {} } if has_bang { self.word("!"); @@ -729,7 +736,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM } match delim { DelimToken::Brace => { - if path.is_some() || has_bang || ident.is_some() { + if header.is_some() || has_bang || ident.is_some() { self.nbsp(); } self.word("{"); @@ -1357,9 +1364,11 @@ impl<'a> State<'a> { } } ast::ItemKind::MacroDef(ref macro_def) => { + let (kw, has_bang) = + if macro_def.legacy { ("macro_rules", true) } else { ("macro", false) }; self.print_mac_common( - Some(&ast::Path::from_ident(ast::Ident::with_empty_ctxt(sym::macro_rules))), - true, + Some(MacHeader::Keyword(kw)), + has_bang, Some(item.ident), DelimToken::Brace, macro_def.stream(), @@ -1754,7 +1763,13 @@ impl<'a> State<'a> { crate fn print_mac(&mut self, m: &ast::Mac) { self.print_mac_common( - Some(&m.node.path), true, None, m.node.delim.to_token(), m.node.stream(), true, m.span + Some(MacHeader::Path(&m.node.path)), + true, + None, + m.node.delim.to_token(), + m.node.stream(), + true, + m.span, ); } |
