Avoid recompiling the implementation of many0 so much
diff --git a/src/data.rs b/src/data.rs
index d9b436b..600c8f1 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -112,7 +112,7 @@
 
     impl Field {
         named!(pub parse_struct -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             vis: syn!(Visibility) >>
             id: syn!(Ident) >>
             colon: punct!(:) >>
@@ -127,7 +127,7 @@
         ));
 
         named!(pub parse_tuple -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             vis: syn!(Visibility) >>
             ty: syn!(Type) >>
             (Field {
diff --git a/src/derive.rs b/src/derive.rs
index da3f2ea..a007c03 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -50,7 +50,7 @@
 
     impl Synom for DeriveInput {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             vis: syn!(Visibility) >>
             which: alt!(
                 keyword!(struct) => { Ok }
@@ -127,7 +127,7 @@
 
     impl Synom for Variant {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             id: syn!(Ident) >>
             data: alt!(
                 struct_like_body => { |(d, b)| VariantData::Struct(d, b) }
diff --git a/src/expr.rs b/src/expr.rs
index 6f81edb..6af15fc 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1452,7 +1452,7 @@
         named!(parse -> Self, do_parse!(
             match_: keyword!(match) >>
             obj: expr_no_struct >>
-            res: braces!(many0!(syn!(Arm))) >>
+            res: braces!(many0!(Arm::parse)) >>
             ({
                 let (arms, brace) = res;
                 ExprMatch {
@@ -1494,7 +1494,7 @@
     #[cfg(feature = "full")]
     impl Synom for Arm {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             pats: call!(Delimited::parse_separated_nonempty) >>
             guard: option!(tuple!(keyword!(if), syn!(Expr))) >>
             rocket: punct!(=>) >>
@@ -1809,10 +1809,10 @@
     #[cfg(feature = "full")]
     impl Block {
         named!(pub parse_within -> Vec<Stmt>, do_parse!(
-            many0!(punct!(;)) >>
-            mut standalone: many0!(terminated!(syn!(Stmt), many0!(punct!(;)))) >>
+            many0!(<Token![;]>::parse) >>
+            mut standalone: many0!(terminated!(syn!(Stmt), many0!(<Token![;]>::parse))) >>
             last: option!(do_parse!(
-                attrs: many0!(call!(Attribute::parse_outer)) >>
+                attrs: many0!(Attribute::parse_outer) >>
                 mut e: syn!(Expr) >>
                 ({
                     e.attrs = attrs;
@@ -1846,7 +1846,7 @@
 
     #[cfg(feature = "full")]
     named!(stmt_mac -> Stmt, do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         what: syn!(Path) >>
         bang: punct!(!) >>
     // Only parse braces here; paren and bracket will get parsed as
@@ -1872,7 +1872,7 @@
 
     #[cfg(feature = "full")]
     named!(stmt_local -> Stmt, do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         let_: keyword!(let) >>
         pat: syn!(Pat) >>
         ty: option!(tuple!(punct!(:), syn!(Type))) >>
@@ -1895,7 +1895,7 @@
 
     #[cfg(feature = "full")]
     named!(stmt_blockexpr -> Stmt, do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         mut e: expr_nosemi >>
         // If the next token is a `.` or a `?` it is special-cased to parse as
         // an expression instead of a blockexpression.
@@ -1914,7 +1914,7 @@
 
     #[cfg(feature = "full")]
     named!(stmt_expr -> Stmt, do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         mut e: syn!(Expr) >>
         semi: punct!(;) >>
         ({
diff --git a/src/file.rs b/src/file.rs
index fd3d5b2..fe06958 100644
--- a/src/file.rs
+++ b/src/file.rs
@@ -16,8 +16,8 @@
 
     impl Synom for File {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_inner)) >>
-            items: many0!(syn!(Item)) >>
+            attrs: many0!(Attribute::parse_inner) >>
+            items: many0!(Item::parse) >>
             (File {
                 shebang: None,
                 attrs: attrs,
diff --git a/src/generics.rs b/src/generics.rs
index fee556c..646b64e 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -239,7 +239,7 @@
 
     impl Synom for LifetimeDef {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             life: syn!(Lifetime) >>
             colon: option!(punct!(:)) >>
             bounds: cond!(
@@ -272,7 +272,7 @@
 
     impl Synom for TypeParam {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             id: syn!(Ident) >>
             colon: option!(punct!(:)) >>
             bounds: cond!(
@@ -321,7 +321,7 @@
 
     impl Synom for ConstParam {
         named!(parse -> Self, do_parse!(
-            attrs: many0!(call!(Attribute::parse_outer)) >>
+            attrs: many0!(Attribute::parse_outer) >>
             const_: keyword!(const) >>
             ident: syn!(Ident) >>
             colon: punct!(:) >>
diff --git a/src/item.rs b/src/item.rs
index d38d25f..7fd97a3 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -510,7 +510,7 @@
     ));
 
     impl_synom!(ItemMacro "macro item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         what: syn!(Path) >>
         bang: punct!(!) >>
         ident: option!(syn!(Ident)) >>
@@ -529,7 +529,7 @@
 
     // TODO: figure out the actual grammar; is body required to be braced?
     impl_synom!(ItemMacro2 "macro2 item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         macro_: keyword!(macro) >>
         ident: syn!(Ident) >>
@@ -546,7 +546,7 @@
     ));
 
     impl_synom!(ItemExternCrate "extern crate item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         extern_: keyword!(extern) >>
         crate_: keyword!(crate) >>
@@ -565,7 +565,7 @@
     ));
 
     impl_synom!(ItemUse "use item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         use_: keyword!(use) >>
         leading_colon: option!(punct!(::)) >>
@@ -652,7 +652,7 @@
     ));
 
     impl_synom!(ItemStatic "static item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         static_: keyword!(static) >>
         mutability: syn!(Mutability) >>
@@ -677,7 +677,7 @@
     ));
 
     impl_synom!(ItemConst "const item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         const_: keyword!(const) >>
         ident: syn!(Ident) >>
@@ -700,7 +700,7 @@
     ));
 
     impl_synom!(ItemFn "fn item" do_parse!(
-        outer_attrs: many0!(call!(Attribute::parse_outer)) >>
+        outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         constness: syn!(Constness) >>
         unsafety: syn!(Unsafety) >>
@@ -712,7 +712,7 @@
         ret: syn!(ReturnType) >>
         where_clause: syn!(WhereClause) >>
         inner_attrs_stmts: braces!(tuple!(
-            many0!(call!(Attribute::parse_inner)),
+            many0!(Attribute::parse_inner),
             call!(Block::parse_within)
         )) >>
         (ItemFn {
@@ -787,7 +787,7 @@
     }
 
     impl_synom!(ItemMod "mod item" do_parse!(
-        outer_attrs: many0!(call!(Attribute::parse_outer)) >>
+        outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         mod_: keyword!(mod) >>
         ident: syn!(Ident) >>
@@ -800,8 +800,8 @@
             |
             braces!(
                 tuple!(
-                    many0!(call!(Attribute::parse_inner)),
-                    many0!(syn!(Item))
+                    many0!(Attribute::parse_inner),
+                    many0!(Item::parse)
                 )
             ) => {|((inner_attrs, items), brace)| (
                 inner_attrs,
@@ -824,9 +824,9 @@
     ));
 
     impl_synom!(ItemForeignMod "foreign mod item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         abi: syn!(Abi) >>
-        items: braces!(many0!(syn!(ForeignItem))) >>
+        items: braces!(many0!(ForeignItem::parse)) >>
         (ItemForeignMod {
             attrs: attrs,
             abi: abi,
@@ -844,7 +844,7 @@
     ));
 
     impl_synom!(ForeignItemFn "foreign function" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         fn_: keyword!(fn) >>
         ident: syn!(Ident) >>
@@ -883,7 +883,7 @@
     ));
 
     impl_synom!(ForeignItemStatic "foreign static" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         static_: keyword!(static) >>
         mutability: syn!(Mutability) >>
@@ -904,7 +904,7 @@
     ));
 
     impl_synom!(ForeignItemType "foreign type" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         type_: keyword!(type) >>
         ident: syn!(Ident) >>
@@ -919,7 +919,7 @@
     ));
 
     impl_synom!(ItemType "type item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         type_: keyword!(type) >>
         ident: syn!(Ident) >>
@@ -958,7 +958,7 @@
     ));
 
     impl_synom!(ItemUnion "union item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         union_: keyword!(union) >>
         ident: syn!(Ident) >>
@@ -980,7 +980,7 @@
     ));
 
     impl_synom!(ItemTrait "trait item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         unsafety: syn!(Unsafety) >>
         auto_: option!(keyword!(auto)) >>
@@ -992,7 +992,7 @@
             call!(Delimited::parse_separated_nonempty)
         ) >>
         where_clause: syn!(WhereClause) >>
-        body: braces!(many0!(syn!(TraitItem))) >>
+        body: braces!(many0!(TraitItem::parse)) >>
         (ItemTrait {
             attrs: attrs,
             vis: vis,
@@ -1012,7 +1012,7 @@
     ));
 
     impl_synom!(ItemDefaultImpl "default impl item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         unsafety: syn!(Unsafety) >>
         impl_: keyword!(impl) >>
         path: syn!(Path) >>
@@ -1041,7 +1041,7 @@
     ));
 
     impl_synom!(TraitItemConst "const trait item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         const_: keyword!(const) >>
         ident: syn!(Ident) >>
         colon: punct!(:) >>
@@ -1060,7 +1060,7 @@
     ));
 
     impl_synom!(TraitItemMethod "method trait item" do_parse!(
-        outer_attrs: many0!(call!(Attribute::parse_outer)) >>
+        outer_attrs: many0!(Attribute::parse_outer) >>
         constness: syn!(Constness) >>
         unsafety: syn!(Unsafety) >>
         abi: option!(syn!(Abi)) >>
@@ -1071,7 +1071,7 @@
         ret: syn!(ReturnType) >>
         where_clause: syn!(WhereClause) >>
         body: option!(braces!(
-            tuple!(many0!(call!(Attribute::parse_inner)),
+            tuple!(many0!(Attribute::parse_inner),
                    call!(Block::parse_within))
         )) >>
         semi: cond!(body.is_none(), punct!(;)) >>
@@ -1116,7 +1116,7 @@
     ));
 
     impl_synom!(TraitItemType "trait item type" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         type_: keyword!(type) >>
         ident: syn!(Ident) >>
         generics: syn!(Generics) >>
@@ -1143,7 +1143,7 @@
     ));
 
     impl_synom!(TraitItemMacro "trait item macro" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         mac: syn!(Macro) >>
         cond!(!mac.is_braced(), punct!(;)) >>
         (TraitItemMacro {
@@ -1153,7 +1153,7 @@
     ));
 
     impl_synom!(ItemImpl "impl item" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         defaultness: syn!(Defaultness) >>
         unsafety: syn!(Unsafety) >>
         impl_: keyword!(impl) >>
@@ -1170,7 +1170,7 @@
         ) >>
         self_ty: syn!(Type) >>
         where_clause: syn!(WhereClause) >>
-        body: braces!(many0!(syn!(ImplItem))) >>
+        body: braces!(many0!(ImplItem::parse)) >>
         (ItemImpl {
             attrs: attrs,
             defaultness: defaultness,
@@ -1198,7 +1198,7 @@
     ));
 
     impl_synom!(ImplItemConst "const item in impl block" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
         const_: keyword!(const) >>
@@ -1223,7 +1223,7 @@
     ));
 
     impl_synom!(ImplItemMethod "method in impl block" do_parse!(
-        outer_attrs: many0!(call!(Attribute::parse_outer)) >>
+        outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
         constness: syn!(Constness) >>
@@ -1236,7 +1236,7 @@
         ret: syn!(ReturnType) >>
         where_clause: syn!(WhereClause) >>
         inner_attrs_stmts: braces!(tuple!(
-            many0!(call!(Attribute::parse_inner)),
+            many0!(Attribute::parse_inner),
             call!(Block::parse_within)
         )) >>
         (ImplItemMethod {
@@ -1273,7 +1273,7 @@
     ));
 
     impl_synom!(ImplItemType "type in impl block" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
         type_: keyword!(type) >>
@@ -1296,7 +1296,7 @@
     ));
 
     impl_synom!(ImplItemMacro "macro in impl block" do_parse!(
-        attrs: many0!(call!(Attribute::parse_outer)) >>
+        attrs: many0!(Attribute::parse_outer) >>
         mac: syn!(Macro) >>
         cond!(!mac.is_braced(), punct!(;)) >>
         (ImplItemMacro {
diff --git a/syn_codegen/src/main.rs b/syn_codegen/src/main.rs
index 0166347..05bfa4b 100644
--- a/syn_codegen/src/main.rs
+++ b/syn_codegen/src/main.rs
@@ -199,7 +199,7 @@
     pub struct AstStruct(pub Vec<AstItem>);
     impl Synom for AstStruct {
         named!(parse -> Self, map!(braces!(do_parse!(
-            many0!(call!(Attribute::parse_outer)) >>
+            many0!(Attribute::parse_outer) >>
             keyword!(pub) >>
             keyword!(struct) >>
             res: call!(ast_struct_inner) >>
@@ -226,7 +226,7 @@
         inner: Option<AstItem>,
     }
     named!(eos_variant -> EosVariant, do_parse!(
-        many0!(call!(Attribute::parse_outer)) >>
+        many0!(Attribute::parse_outer) >>
         keyword!(pub) >>
         variant: syn!(Ident) >>
         member: map!(parens!(alt!(
@@ -246,11 +246,11 @@
     pub struct AstEnumOfStructs(pub Vec<AstItem>);
     impl Synom for AstEnumOfStructs {
         named!(parse -> Self, map!(braces!(do_parse!(
-            many0!(call!(Attribute::parse_outer)) >>
+            many0!(Attribute::parse_outer) >>
             keyword!(pub) >>
             keyword!(enum) >>
             id: syn!(Ident) >>
-            body: braces!(many0!(call!(eos_variant))) >>
+            body: braces!(many0!(eos_variant)) >>
             option!(syn!(Ident)) >> // do_not_generate_to_tokens
             ({
                 // XXX: This is really gross - we shouldn't have to convert the