about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-14 16:09:39 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-15 12:42:07 +0300
commit0cdd18d0a7b9d3c52017b57eecda6e198e9512b1 (patch)
tree11e861c4e4f4a0eea33d6068dbb2e70ff9e63fd1 /src/libsyntax
parenta2a1cd186481c49d1cde611e4f3f2a707e77eab9 (diff)
downloadrust-0cdd18d0a7b9d3c52017b57eecda6e198e9512b1.tar.gz
rust-0cdd18d0a7b9d3c52017b57eecda6e198e9512b1.zip
pprust: Support `macro` macros
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/print/pprust.rs31
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,
         );
     }