Inline away BareFnType
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 043a61e..c30bdf4 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -62,8 +62,6 @@
 
 fn fold_bare_fn_arg_name(&mut self, i: BareFnArgName) -> BareFnArgName { fold_bare_fn_arg_name(self, i) }
 
-fn fold_bare_fn_type(&mut self, i: BareFnType) -> BareFnType { fold_bare_fn_type(self, i) }
-
 fn fold_bin_op(&mut self, i: BinOp) -> BinOp { fold_bin_op(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_block(&mut self, i: Block) -> Block { fold_block(self, i) }
@@ -508,19 +506,6 @@
     }
 }
 
-pub fn fold_bare_fn_type<V: Folder + ?Sized>(_visitor: &mut V, _i: BareFnType) -> BareFnType {
-    BareFnType {
-        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
-        abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
-        fn_token: Token ! [ fn ](tokens_helper(_visitor, &(_i . fn_token).0)),
-        lifetimes: (_i . lifetimes).map(|it| { _visitor.fold_bound_lifetimes(it) }),
-        paren_token: Paren(tokens_helper(_visitor, &(_i . paren_token).0)),
-        inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_bare_fn_arg(it) }),
-        variadic: (_i . variadic).map(|it| { Token ! [ ... ](tokens_helper(_visitor, &(it).0)) }),
-        output: _visitor.fold_return_type(_i . output),
-    }
-}
-
 pub fn fold_bin_op<V: Folder + ?Sized>(_visitor: &mut V, _i: BinOp) -> BinOp {
     use ::BinOp::*;
     match _i {
@@ -2449,7 +2434,14 @@
 
 pub fn fold_type_bare_fn<V: Folder + ?Sized>(_visitor: &mut V, _i: TypeBareFn) -> TypeBareFn {
     TypeBareFn {
-        ty: Box::new(_visitor.fold_bare_fn_type(* _i . ty)),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
+        abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
+        fn_token: Token ! [ fn ](tokens_helper(_visitor, &(_i . fn_token).0)),
+        lifetimes: (_i . lifetimes).map(|it| { _visitor.fold_bound_lifetimes(it) }),
+        paren_token: Paren(tokens_helper(_visitor, &(_i . paren_token).0)),
+        inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_bare_fn_arg(it) }),
+        variadic: (_i . variadic).map(|it| { Token ! [ ... ](tokens_helper(_visitor, &(it).0)) }),
+        output: _visitor.fold_return_type(_i . output),
     }
 }
 
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 1f140ff..ea9cae6 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -58,8 +58,6 @@
 
 fn visit_bare_fn_arg_name(&mut self, i: &'ast BareFnArgName) { visit_bare_fn_arg_name(self, i) }
 
-fn visit_bare_fn_type(&mut self, i: &'ast BareFnType) { visit_bare_fn_type(self, i) }
-
 fn visit_bin_op(&mut self, i: &'ast BinOp) { visit_bin_op(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_block(&mut self, i: &'ast Block) { visit_block(self, i) }
@@ -470,17 +468,6 @@
     }
 }
 
-pub fn visit_bare_fn_type<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast BareFnType) {
-    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
-    if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
-    tokens_helper(_visitor, &(& _i . fn_token).0);
-    if let Some(ref it) = _i . lifetimes { _visitor.visit_bound_lifetimes(it) };
-    tokens_helper(_visitor, &(& _i . paren_token).0);
-    for el in & _i . inputs { let it = el.item(); _visitor.visit_bare_fn_arg(it) };
-    if let Some(ref it) = _i . variadic { tokens_helper(_visitor, &(it).0) };
-    _visitor.visit_return_type(& _i . output);
-}
-
 pub fn visit_bin_op<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast BinOp) {
     use ::BinOp::*;
     match *_i {
@@ -1903,7 +1890,14 @@
 }
 
 pub fn visit_type_bare_fn<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TypeBareFn) {
-    _visitor.visit_bare_fn_type(& * _i . ty);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
+    if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
+    tokens_helper(_visitor, &(& _i . fn_token).0);
+    if let Some(ref it) = _i . lifetimes { _visitor.visit_bound_lifetimes(it) };
+    tokens_helper(_visitor, &(& _i . paren_token).0);
+    for el in & _i . inputs { let it = el.item(); _visitor.visit_bare_fn_arg(it) };
+    if let Some(ref it) = _i . variadic { tokens_helper(_visitor, &(it).0) };
+    _visitor.visit_return_type(& _i . output);
 }
 
 pub fn visit_type_binding<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TypeBinding) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 7657273..0764da9 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -58,8 +58,6 @@
 
 fn visit_bare_fn_arg_name_mut(&mut self, i: &mut BareFnArgName) { visit_bare_fn_arg_name_mut(self, i) }
 
-fn visit_bare_fn_type_mut(&mut self, i: &mut BareFnType) { visit_bare_fn_type_mut(self, i) }
-
 fn visit_bin_op_mut(&mut self, i: &mut BinOp) { visit_bin_op_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_block_mut(&mut self, i: &mut Block) { visit_block_mut(self, i) }
@@ -470,17 +468,6 @@
     }
 }
 
-pub fn visit_bare_fn_type_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut BareFnType) {
-    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
-    if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
-    tokens_helper(_visitor, &mut (& mut _i . fn_token).0);
-    if let Some(ref mut it) = _i . lifetimes { _visitor.visit_bound_lifetimes_mut(it) };
-    tokens_helper(_visitor, &mut (& mut _i . paren_token).0);
-    for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_bare_fn_arg_mut(it) };
-    if let Some(ref mut it) = _i . variadic { tokens_helper(_visitor, &mut (it).0) };
-    _visitor.visit_return_type_mut(& mut _i . output);
-}
-
 pub fn visit_bin_op_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut BinOp) {
     use ::BinOp::*;
     match *_i {
@@ -1903,7 +1890,14 @@
 }
 
 pub fn visit_type_bare_fn_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut TypeBareFn) {
-    _visitor.visit_bare_fn_type_mut(& mut * _i . ty);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
+    if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
+    tokens_helper(_visitor, &mut (& mut _i . fn_token).0);
+    if let Some(ref mut it) = _i . lifetimes { _visitor.visit_bound_lifetimes_mut(it) };
+    tokens_helper(_visitor, &mut (& mut _i . paren_token).0);
+    for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_bare_fn_arg_mut(it) };
+    if let Some(ref mut it) = _i . variadic { tokens_helper(_visitor, &mut (it).0) };
+    _visitor.visit_return_type_mut(& mut _i . output);
 }
 
 pub fn visit_type_binding_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut TypeBinding) {
diff --git a/src/lib.rs b/src/lib.rs
index a6a031f..b13a1ed 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -87,7 +87,7 @@
 pub use op::{BinOp, UnOp};
 
 mod ty;
-pub use ty::{Abi, AbiKind, AngleBracketedGenericArguments, BareFnArg, BareFnArgName, BareFnType,
+pub use ty::{Abi, AbiKind, AngleBracketedGenericArguments, BareFnArg, BareFnArgName,
              GenericArgument, ParenthesizedGenericArguments, Path,
              PathArguments, PathSegment, PolyTraitRef, QSelf, ReturnType, Type, TypeArray,
              TypeBareFn, TypeBinding, TypeGroup, TypeImplTrait, TypeInfer, TypeNever, TypeParen,
diff --git a/src/ty.rs b/src/ty.rs
index 970ddfd..5b8c819 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -32,7 +32,14 @@
         }),
         /// A bare function (e.g. `fn(usize) -> bool`)
         pub BareFn(TypeBareFn {
-            pub ty: Box<BareFnType>,
+            pub unsafety: Option<Token![unsafe]>,
+            pub abi: Option<Abi>,
+            pub fn_token: Token![fn],
+            pub lifetimes: Option<BoundLifetimes>,
+            pub paren_token: token::Paren,
+            pub inputs: Delimited<BareFnArg, Token![,]>,
+            pub variadic: Option<Token![...]>,
+            pub output: ReturnType,
         }),
         /// The never type (`!`)
         pub Never(TypeNever {
@@ -262,19 +269,6 @@
 }
 
 ast_struct! {
-    pub struct BareFnType {
-        pub unsafety: Option<Token![unsafe]>,
-        pub abi: Option<Abi>,
-        pub fn_token: Token![fn],
-        pub lifetimes: Option<BoundLifetimes>,
-        pub paren_token: token::Paren,
-        pub inputs: Delimited<BareFnArg, Token![,]>,
-        pub variadic: Option<Token![...]>,
-        pub output: ReturnType,
-    }
-}
-
-ast_struct! {
     pub struct Abi {
         pub extern_token: Token![extern],
         pub kind: AbiKind,
@@ -454,16 +448,14 @@
             )) >>
             output: syn!(ReturnType) >>
             (TypeBareFn {
-                ty: Box::new(BareFnType {
-                    unsafety: unsafety,
-                    abi: abi,
-                    lifetimes: lifetimes,
-                    output: output,
-                    variadic: (parens.0).1,
-                    fn_token: fn_,
-                    paren_token: parens.1,
-                    inputs: (parens.0).0,
-                }),
+                unsafety: unsafety,
+                abi: abi,
+                lifetimes: lifetimes,
+                output: output,
+                variadic: (parens.0).1,
+                fn_token: fn_,
+                paren_token: parens.1,
+                inputs: (parens.0).0,
             })
         ));
     }
@@ -847,7 +839,21 @@
 
     impl ToTokens for TypeBareFn {
         fn to_tokens(&self, tokens: &mut Tokens) {
-            self.ty.to_tokens(tokens)
+            self.lifetimes.to_tokens(tokens);
+            self.unsafety.to_tokens(tokens);
+            self.abi.to_tokens(tokens);
+            self.fn_token.to_tokens(tokens);
+            self.paren_token.surround(tokens, |tokens| {
+                self.inputs.to_tokens(tokens);
+                if let Some(ref variadic) = self.variadic {
+                    if !self.inputs.empty_or_trailing() {
+                        let span = variadic.0[0];
+                        <Token![,]>::new(span).to_tokens(tokens);
+                    }
+                    variadic.to_tokens(tokens);
+                }
+            });
+            self.output.to_tokens(tokens);
         }
     }
 
@@ -1044,26 +1050,6 @@
         }
     }
 
-    impl ToTokens for BareFnType {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            self.lifetimes.to_tokens(tokens);
-            self.unsafety.to_tokens(tokens);
-            self.abi.to_tokens(tokens);
-            self.fn_token.to_tokens(tokens);
-            self.paren_token.surround(tokens, |tokens| {
-                self.inputs.to_tokens(tokens);
-                if let Some(ref variadic) = self.variadic {
-                    if !self.inputs.empty_or_trailing() {
-                        let span = variadic.0[0];
-                        <Token![,]>::new(span).to_tokens(tokens);
-                    }
-                    variadic.to_tokens(tokens);
-                }
-            });
-            self.output.to_tokens(tokens);
-        }
-    }
-
     impl ToTokens for BareFnArg {
         fn to_tokens(&self, tokens: &mut Tokens) {
             if let Some((ref name, ref colon)) = self.name {