Trait macro semicolon fixes
diff --git a/src/item.rs b/src/item.rs
index 3379d95..0066003 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -229,7 +229,7 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use {FunctionRetTy, Generics, Ident, Mac, TokenTree, VariantData, Visibility};
+ use {DelimToken, FunctionRetTy, Generics, Ident, Mac, TokenTree, VariantData, Visibility};
use attr::parsing::outer_attr;
use data::parsing::{struct_like_body, visibility};
use expr::parsing::{block, expr, pat};
@@ -577,6 +577,10 @@
id: ident >>
punct!("!") >>
body: delimited >>
+ cond!(match body.delim {
+ DelimToken::Paren | DelimToken::Bracket => true,
+ DelimToken::Brace => false,
+ }, punct!(";")) >>
(TraitItem {
ident: id.clone(),
attrs: attrs,
@@ -798,6 +802,12 @@
}
TraitItemKind::Macro(ref mac) => {
mac.to_tokens(tokens);
+ match mac.tts.last() {
+ Some(&TokenTree::Delimited(Delimited { delim: DelimToken::Brace, .. })) => {
+ // no semicolon
+ }
+ _ => tokens.append(";"),
+ }
}
}
}
diff --git a/tests/cases/traits.rs b/tests/cases/traits.rs
index 18d34f9..09ee72c 100644
--- a/tests/cases/traits.rs
+++ b/tests/cases/traits.rs
@@ -25,3 +25,10 @@
type X = ();
type X: 'a + B = ();
}
+
+trait T {
+ mac!();
+ mac!{}
+ mac!();
+ mac!{}
+}