Parse based on proc-macro2
diff --git a/src/item.rs b/src/item.rs
index 4cbac33..8d55f5c 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -365,17 +365,13 @@
     named!(view_path_list -> ViewPath, do_parse!(
         path: path >>
         punct!("::") >>
-        punct!("{") >>
-        items: terminated_list!(punct!(","), path_list_item) >>
-        punct!("}") >>
+        items: delim!(Brace, terminated_list!(punct!(","), path_list_item)) >>
         (ViewPath::List(path, items))
     ));
 
     named!(view_path_list_root -> ViewPath, do_parse!(
         global: option!(punct!("::")) >>
-        punct!("{") >>
-        items: terminated_list!(punct!(","), path_list_item) >>
-        punct!("}") >>
+        items: delim!(Brace, terminated_list!(punct!(","), path_list_item)) >>
         (ViewPath::List(Path {
             global: global.is_some(),
             segments: Vec::new(),
@@ -441,21 +437,18 @@
         keyword!("fn") >>
         name: ident >>
         generics: generics >>
-        punct!("(") >>
-        inputs: terminated_list!(punct!(","), fn_arg) >>
-        punct!(")") >>
+        inputs: delim!(Parenthesis, terminated_list!(punct!(","), fn_arg)) >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
-        punct!("{") >>
-        inner_attrs: many0!(inner_attr) >>
-        stmts: within_block >>
-        punct!("}") >>
+        inner_attrs_stmts: delim!(Brace, tuple!(
+            many0!(inner_attr), within_block
+        )) >>
         (Item {
             ident: name,
             vis: vis,
             attrs: {
                 let mut attrs = outer_attrs;
-                attrs.extend(inner_attrs);
+                attrs.extend(inner_attrs_stmts.0);
                 attrs
             },
             node: ItemKind::Fn(
@@ -472,7 +465,7 @@
                     .. generics
                 },
                 Box::new(Block {
-                    stmts: stmts,
+                    stmts: inner_attrs_stmts.1,
                 }),
             ),
         })
@@ -513,13 +506,12 @@
         content: alt!(
             punct!(";") => { |_| None }
             |
-            delimited!(
-                punct!("{"),
+            delim!(
+                Brace,
                 tuple!(
                     many0!(inner_attr),
                     items
-                ),
-                punct!("}")
+                )
             ) => { Some }
         ) >>
         (match content {
@@ -545,9 +537,7 @@
     named!(item_foreign_mod -> Item, do_parse!(
         attrs: many0!(outer_attr) >>
         abi: abi >>
-        punct!("{") >>
-        items: many0!(foreign_item) >>
-        punct!("}") >>
+        items: delim!(Brace, many0!(foreign_item)) >>
         (Item {
             ident: "".into(),
             vis: Visibility::Inherited,
@@ -571,11 +561,12 @@
         keyword!("fn") >>
         name: ident >>
         generics: generics >>
-        punct!("(") >>
-        inputs: separated_list!(punct!(","), fn_arg) >>
-        trailing_comma: option!(punct!(",")) >>
-        variadic: option!(cond_reduce!(trailing_comma.is_some(), punct!("..."))) >>
-        punct!(")") >>
+        inputs_and_variadic: delim!(Parenthesis, do_parse!(
+            inputs: separated_list!(punct!(","), fn_arg) >>
+            trailing_comma: option!(punct!(",")) >>
+            variadic: option!(cond_reduce!(trailing_comma.is_some(), punct!("..."))) >>
+            ((inputs, variadic.is_some()))
+        )) >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
         punct!(";") >>
@@ -584,9 +575,9 @@
             attrs: attrs,
             node: ForeignItemKind::Fn(
                 Box::new(FnDecl {
-                    inputs: inputs,
+                    inputs: inputs_and_variadic.0,
                     output: ret.map(FunctionRetTy::Ty).unwrap_or(FunctionRetTy::Default),
-                    variadic: variadic.is_some(),
+                    variadic: inputs_and_variadic.1,
                 }),
                 Generics {
                     where_clause: where_clause,
@@ -689,9 +680,7 @@
             separated_nonempty_list!(punct!("+"), ty_param_bound)
         )) >>
         where_clause: where_clause >>
-        punct!("{") >>
-        body: many0!(trait_item) >>
-        punct!("}") >>
+        body: delim!(Brace, many0!(trait_item)) >>
         (Item {
             ident: id,
             vis: vis,
@@ -715,8 +704,7 @@
         path: path >>
         keyword!("for") >>
         punct!("..") >>
-        punct!("{") >>
-        punct!("}") >>
+        delim!(Brace, epsilon!()) >>
         (Item {
             ident: "".into(),
             vis: Visibility::Inherited,
@@ -758,15 +746,12 @@
         keyword!("fn") >>
         name: ident >>
         generics: generics >>
-        punct!("(") >>
-        inputs: terminated_list!(punct!(","), fn_arg) >>
-        punct!(")") >>
+        inputs: delim!(Parenthesis, terminated_list!(punct!(","), fn_arg)) >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
-        body: option!(delimited!(
-            punct!("{"),
-            tuple!(many0!(inner_attr), within_block),
-            punct!("}")
+        body: option!(delim!(
+            Brace,
+            tuple!(many0!(inner_attr), within_block)
         )) >>
         cond!(body.is_none(), punct!(";")) >>
         ({
@@ -855,9 +840,7 @@
         ) >>
         self_ty: ty >>
         where_clause: where_clause >>
-        punct!("{") >>
-        body: many0!(impl_item) >>
-        punct!("}") >>
+        body: delim!(Brace, many0!(impl_item)) >>
         (Item {
             ident: "".into(),
             vis: Visibility::Inherited,
@@ -916,22 +899,19 @@
         keyword!("fn") >>
         name: ident >>
         generics: generics >>
-        punct!("(") >>
-        inputs: terminated_list!(punct!(","), fn_arg) >>
-        punct!(")") >>
+        inputs: delim!(Parenthesis, terminated_list!(punct!(","), fn_arg)) >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
-        punct!("{") >>
-        inner_attrs: many0!(inner_attr) >>
-        stmts: within_block >>
-        punct!("}") >>
+        inner_attrs_stmts: delim!(Brace, tuple!(
+            many0!(inner_attr), within_block
+        )) >>
         (ImplItem {
             ident: name,
             vis: vis,
             defaultness: defaultness,
             attrs: {
                 let mut attrs = outer_attrs;
-                attrs.extend(inner_attrs);
+                attrs.extend(inner_attrs_stmts.0);
                 attrs
             },
             node: ImplItemKind::Method(
@@ -950,7 +930,7 @@
                     },
                 },
                 Block {
-                    stmts: stmts,
+                    stmts: inner_attrs_stmts.1,
                 },
             ),
         })