Macro item printing
diff --git a/src/expr.rs b/src/expr.rs
index e3e4e55..647edbd 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -827,19 +827,12 @@
 
     fn requires_semi(e: &Expr) -> bool {
         match *e {
-            Expr::Mac(ref mac) => {
-                let len = mac.tts.len();
-                if let TokenTree::Delimited(
-                    Delimited {
-                        delim: DelimToken::Brace,
-                        ..
-                    }
-                ) = mac.tts[len - 1] {
-                    false
-                } else {
-                    true
-                }
-            }
+            Expr::Mac(ref mac) => match mac.tts.last() {
+                Some(&TokenTree::Delimited(
+                    Delimited { delim: DelimToken::Brace, .. }
+                )) => false,
+                _ => true,
+            },
 
             Expr::If(_, _, _) |
             Expr::IfLet(_, _, _, _) |
@@ -1164,7 +1157,7 @@
                     tokens.append("return");
                     opt_expr.to_tokens(tokens);
                 }
-                Expr::Mac(ref _mac) => unimplemented!(),
+                Expr::Mac(ref mac) => mac.to_tokens(tokens),
                 Expr::Struct(ref path, ref fields, ref base) => {
                     path.to_tokens(tokens);
                     tokens.append("{");
@@ -1309,7 +1302,7 @@
                 Pat::Lit(ref _expr) => unimplemented!(),
                 Pat::Range(ref _lower, ref _upper) => unimplemented!(),
                 Pat::Vec(ref _before, ref _dots, ref _after) => unimplemented!(),
-                Pat::Mac(ref _mac) => unimplemented!(),
+                Pat::Mac(ref mac) => mac.to_tokens(tokens),
             }
         }
     }
diff --git a/src/item.rs b/src/item.rs
index 1c0ec66..8c87b3a 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -437,7 +437,7 @@
 #[cfg(feature = "printing")]
 mod printing {
     use super::*;
-    use FunctionRetTy;
+    use {Delimited, DelimToken, FunctionRetTy, TokenTree};
     use attr::FilterAttrs;
     use data::VariantData;
     use quote::{Tokens, ToTokens};
@@ -539,7 +539,20 @@
                 ItemKind::Trait(_unsafety, ref _generics, ref _bound, ref _item) => unimplemented!(),
                 ItemKind::DefaultImpl(_unsafety, ref _path) => unimplemented!(),
                 ItemKind::Impl(_unsafety, _polarity, ref _generics, ref _path, ref _ty, ref _item) => unimplemented!(),
-                ItemKind::Mac(ref _mac) => unimplemented!(),
+                ItemKind::Mac(ref mac) => {
+                    mac.path.to_tokens(tokens);
+                    tokens.append("!");
+                    self.ident.to_tokens(tokens);
+                    for tt in &mac.tts {
+                        tt.to_tokens(tokens);
+                    }
+                    match mac.tts.last() {
+                        Some(&TokenTree::Delimited(
+                            Delimited { delim: DelimToken::Brace, .. }
+                        )) => { /* no semicolon */ }
+                        _ => tokens.append(";"),
+                    }
+                }
             }
         }
     }