Inner attributes within functions and methods
diff --git a/src/expr.rs b/src/expr.rs
index 155a0ef..9e8adbd 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -797,7 +797,7 @@
         epsilon!() => { |_| BlockCheckMode::Default }
     ));
 
-    named!(within_block -> Vec<Stmt>, do_parse!(
+    named!(pub within_block -> Vec<Stmt>, do_parse!(
         many0!(punct!(";")) >>
         mut standalone: many0!(terminated!(standalone_stmt, many0!(punct!(";")))) >>
         last: option!(expr) >>
@@ -1547,9 +1547,7 @@
     impl ToTokens for Block {
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append("{");
-            for stmt in &self.stmts {
-                stmt.to_tokens(tokens);
-            }
+            tokens.append_all(&self.stmts);
             tokens.append("}");
         }
     }
diff --git a/src/item.rs b/src/item.rs
index 273f1c5..5600507 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -234,10 +234,11 @@
 #[cfg(feature = "parsing")]
 pub mod parsing {
     use super::*;
-    use {DelimToken, FunctionRetTy, Generics, Ident, Mac, Path, TokenTree, VariantData, Visibility};
+    use {Block, DelimToken, FunctionRetTy, Generics, Ident, Mac, Path, TokenTree, VariantData,
+         Visibility};
     use attr::parsing::{inner_attr, outer_attr};
     use data::parsing::{struct_like_body, visibility};
-    use expr::parsing::{block, expr, pat};
+    use expr::parsing::{block, expr, pat, within_block};
     use generics::parsing::{generics, lifetime, ty_param_bound, where_clause};
     use ident::parsing::ident;
     use mac::parsing::delimited;
@@ -432,7 +433,7 @@
     ));
 
     named!(item_fn -> Item, do_parse!(
-        attrs: many0!(outer_attr) >>
+        outer_attrs: many0!(outer_attr) >>
         vis: visibility >>
         constness: constness >>
         unsafety: unsafety >>
@@ -445,11 +446,18 @@
         punct!(")") >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
-        body: block >>
+        punct!("{") >>
+        inner_attrs: many0!(inner_attr) >>
+        stmts: within_block >>
+        punct!("}") >>
         (Item {
             ident: name,
             vis: vis,
-            attrs: attrs,
+            attrs: {
+                let mut attrs = outer_attrs;
+                attrs.extend(inner_attrs);
+                attrs
+            },
             node: ItemKind::Fn(
                 Box::new(FnDecl {
                     inputs: inputs,
@@ -463,7 +471,9 @@
                     where_clause: where_clause,
                     .. generics
                 },
-                Box::new(body),
+                Box::new(Block {
+                    stmts: stmts,
+                }),
             ),
         })
     ));
@@ -876,7 +886,7 @@
     ));
 
     named!(impl_item_method -> ImplItem, do_parse!(
-        attrs: many0!(outer_attr) >>
+        outer_attrs: many0!(outer_attr) >>
         vis: visibility >>
         defaultness: defaultness >>
         constness: constness >>
@@ -890,12 +900,19 @@
         punct!(")") >>
         ret: option!(preceded!(punct!("->"), ty)) >>
         where_clause: where_clause >>
-        body: block >>
+        punct!("{") >>
+        inner_attrs: many0!(inner_attr) >>
+        stmts: within_block >>
+        punct!("}") >>
         (ImplItem {
             ident: name,
             vis: vis,
             defaultness: defaultness,
-            attrs: attrs,
+            attrs: {
+                let mut attrs = outer_attrs;
+                attrs.extend(inner_attrs);
+                attrs
+            },
             node: ImplItemKind::Method(
                 MethodSig {
                     unsafety: unsafety,
@@ -911,7 +928,9 @@
                         .. generics
                     },
                 },
-                body,
+                Block {
+                    stmts: stmts,
+                },
             ),
         })
     ));
@@ -1039,7 +1058,10 @@
                         ty.to_tokens(tokens);
                     }
                     generics.where_clause.to_tokens(tokens);
-                    block.to_tokens(tokens);
+                    tokens.append("{");
+                    tokens.append_all(self.attrs.inner());
+                    tokens.append_all(&block.stmts);
+                    tokens.append("}");
                 }
                 ItemKind::Mod(ref items) => {
                     self.vis.to_tokens(tokens);
@@ -1240,7 +1262,12 @@
                     }
                     sig.generics.where_clause.to_tokens(tokens);
                     match *block {
-                        Some(ref block) => block.to_tokens(tokens),
+                        Some(ref block) => {
+                            tokens.append("{");
+                            tokens.append_all(self.attrs.inner());
+                            tokens.append_all(&block.stmts);
+                            tokens.append("}");
+                        }
                         None => tokens.append(";"),
                     }
                 }