Combine Expr and ExprKind
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 34c88bb..e0318ff 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -271,13 +271,13 @@
                     data: VariantData::Unit,
                     discriminant: Some((
                         Default::default(),
-                        Expr {
-                            node: Lit {
+                        Expr::Lit(ExprLit {
+                            attrs: Vec::new(),
+                            lit: Lit {
                                 value: LitKind::Other(Literal::isize(0)),
                                 span: Default::default(),
-                            }.into(),
-                            attrs: Vec::new(),
-                        },
+                            },
+                        }),
                     )),
                 },
                 Variant {
@@ -286,38 +286,34 @@
                     data: VariantData::Unit,
                     discriminant: Some((
                         Default::default(),
-                        Expr {
-                            node: ExprField {
-                                base: Box::new(Expr {
-                                    node: ExprTuple {
-                                        paren_token: Default::default(),
-                                        args: vec![
-                                            Expr {
-                                                node: ExprKind::Lit(Lit {
-                                                    value: LitKind::Other(Literal::integer(0)),
-                                                    span: Default::default(),
-                                                }),
-                                                attrs: Vec::new(),
-                                            },
-                                            Expr {
-                                                node: ExprKind::Lit(Lit {
-                                                    value: LitKind::Other(Literal::string("data")),
-                                                    span: Default::default(),
-                                                }),
-                                                attrs: Vec::new(),
-                                            },
-                                        ].into(),
-                                    }.into(),
-                                    attrs: Vec::new(),
-                                }),
-                                dot_token: Default::default(),
-                                member: Member::Unnamed(Index {
-                                    index: 0,
-                                    span: Default::default(),
-                                }),
-                            }.into(),
+                        Expr::Field(ExprField {
                             attrs: Vec::new(),
-                        },
+                            base: Box::new(Expr::Tuple(ExprTuple {
+                                attrs: Vec::new(),
+                                paren_token: Default::default(),
+                                args: vec![
+                                    Expr::Lit(ExprLit {
+                                        attrs: Vec::new(),
+                                        lit: Lit {
+                                            value: LitKind::Other(Literal::integer(0)),
+                                            span: Default::default(),
+                                        },
+                                    }),
+                                    Expr::Lit(ExprLit {
+                                        attrs: Vec::new(),
+                                        lit: Lit {
+                                            value: LitKind::Other(Literal::string("data")),
+                                            span: Default::default(),
+                                        },
+                                    }),
+                                ].into(),
+                            })),
+                            dot_token: Default::default(),
+                            member: Member::Unnamed(Index {
+                                index: 0,
+                                span: Default::default(),
+                            }),
+                        }),
                     )),
                 },
             ].into(),
diff --git a/tests/test_expr.rs b/tests/test_expr.rs
index 5967aa6..4a76669 100644
--- a/tests/test_expr.rs
+++ b/tests/test_expr.rs
@@ -95,7 +95,7 @@
     assert_let!(Item::Fn(ItemFn { ref block, .. }) = actual.items[1]; {
         assert_let!(Stmt::Local(ref local) = block.stmts[0]; {
             assert_let!(Local { init: Some(ref init_expr), .. } = **local; {
-                assert_let!(Expr { node: ExprKind::Catch(..), .. } = **init_expr);
+                assert_let!(Expr::Catch(..) = **init_expr);
             });
         });
 
@@ -106,21 +106,21 @@
         });
 
         assert_let!(Stmt::Expr(ref expr) = block.stmts[3]; {
-            assert_let!(Expr { node: ExprKind::While(ExprWhile { ref cond, .. }), .. } = **expr; {
-                assert_let!(Expr { node: ExprKind::Path(ExprPath { qself: None, ref path }), .. } = **cond; {
+            assert_let!(Expr::While(ExprWhile { ref cond, .. }) = **expr; {
+                assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **cond; {
                     assert_eq!(*path, "catch".into());
                 });
             });
         });
 
         assert_let!(Stmt::Semi(ref expr, _) = block.stmts[5]; {
-            assert_let!(Expr { node: ExprKind::Assign(ExprAssign { ref left, ref right, .. }), .. } = **expr; {
-                assert_let!(Expr { node: ExprKind::Path(ExprPath { qself: None, ref path }), .. } = **left; {
+            assert_let!(Expr::Assign(ExprAssign { ref left, ref right, .. }) = **expr; {
+                assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **left; {
                     assert_eq!(*path, "catch".into());
                 });
 
-                assert_let!(Expr { node: ExprKind::If(ExprIf { ref cond, .. }), .. } = **right; {
-                    assert_let!(Expr { node: ExprKind::Path(ExprPath { qself: None, ref path }), .. } = **cond; {
+                assert_let!(Expr::If(ExprIf { ref cond, .. }) = **right; {
+                    assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **cond; {
                         assert_eq!(*path, "catch".into());
                     });
                 });
@@ -128,8 +128,8 @@
         });
 
         assert_let!(Stmt::Semi(ref expr, _) = block.stmts[7]; {
-            assert_let!(Expr { node: ExprKind::Match(ExprMatch { ref expr, .. }), .. } = **expr; {
-                assert_let!(Expr { node: ExprKind::Path(ExprPath { qself: None, ref path }), .. } = **expr; {
+            assert_let!(Expr::Match(ExprMatch { ref expr, .. }) = **expr; {
+                assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **expr; {
                     assert_eq!(*path, "catch".into());
                 });
             });
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
index f532639..b09225e 100644
--- a/tests/test_grouping.rs
+++ b/tests/test_grouping.rs
@@ -3,7 +3,7 @@
 
 #[macro_use]
 extern crate syn;
-use syn::{BinOp, Expr, ExprBinary, ExprGroup, ExprKind, Lit, LitKind};
+use syn::{BinOp, Expr, ExprBinary, ExprGroup, ExprLit, Lit, LitKind};
 use syn::token::Group;
 
 extern crate proc_macro2;
@@ -18,14 +18,17 @@
     }
 }
 
-fn expr<T: Into<ExprKind>>(t: T) -> Expr {
-    t.into().into()
+fn expr<T: Into<Expr>>(t: T) -> Expr {
+    t.into()
 }
 
 fn lit<T: Into<Literal>>(t: T) -> Expr {
-    expr(Lit {
-        value: LitKind::Other(t.into()),
-        span: Span::default(),
+    Expr::Lit(ExprLit {
+        attrs: Vec::new(),
+        lit: Lit {
+            value: LitKind::Other(t.into()),
+            span: Span::default(),
+        },
     })
 }
 
@@ -53,12 +56,16 @@
     assert_eq!(
         common::parse::syn::<Expr>(raw),
         expr(ExprBinary {
+            attrs: Vec::new(),
             left: Box::new(lit(Literal::i32(1))),
             op: BinOp::Add(<Token![+]>::default()),
             right: Box::new(expr(ExprBinary {
+                attrs: Vec::new(),
                 left: Box::new(expr(ExprGroup {
+                    attrs: Vec::new(),
                     group_token: Group::default(),
                     expr: Box::new(expr(ExprBinary {
+                        attrs: Vec::new(),
                         left: Box::new(lit(Literal::i32(2))),
                         op: BinOp::Add(<Token![+]>::default()),
                         right: Box::new(lit(Literal::i32(3))),
@@ -95,13 +102,16 @@
     assert_eq!(
         common::parse::syn::<Expr>(raw),
         expr(ExprBinary {
+            attrs: Vec::new(),
             left: Box::new(expr(ExprBinary {
+                attrs: Vec::new(),
                 left: Box::new(lit(Literal::i32(1))),
                 op: BinOp::Add(<Token![+]>::default()),
                 right: Box::new(lit(Literal::i32(2))),
             })),
             op: BinOp::Add(<Token![+]>::default()),
             right: Box::new(expr(ExprBinary {
+                attrs: Vec::new(),
                 left: Box::new(lit(Literal::i32(3))),
                 op: BinOp::Mul(<Token![*]>::default()),
                 right: Box::new(lit(Literal::i32(4))),
diff --git a/tests/test_precedence.rs b/tests/test_precedence.rs
index d8dc4ed..9071b04 100644
--- a/tests/test_precedence.rs
+++ b/tests/test_precedence.rs
@@ -292,15 +292,15 @@
 fn syn_brackets(syn_expr: syn::Expr) -> syn::Expr {
     use syn::*;
     use syn::fold::*;
+    use std::mem;
 
-    fn paren(folder: &mut BracketsFolder, node: ExprKind) -> ExprKind {
-        ExprKind::Paren(ExprParen {
+    fn paren(folder: &mut BracketsFolder, mut node: Expr) -> Expr {
+        let attrs = mem::replace(node.attrs_mut(), Vec::new());
+        Expr::Paren(ExprParen {
+            attrs: attrs,
             expr: Box::new(fold_expr(
                 folder,
-                Expr {
-                    node: node,
-                    attrs: vec![],
-                },
+                node,
             )),
             paren_token: token::Paren::default(),
         })
@@ -309,19 +309,17 @@
     struct BracketsFolder;
     impl Folder for BracketsFolder {
         fn fold_expr(&mut self, expr: Expr) -> Expr {
-            let kind = match expr.node {
-                ExprKind::Group(_) => unreachable!(),
-                ExprKind::Paren(p) => paren(self, p.expr.node),
-                ExprKind::If(..)
-                | ExprKind::Unsafe(..)
-                | ExprKind::Block(..)
-                | ExprKind::IfLet(..) => {
+            match expr {
+                Expr::Group(_) => unreachable!(),
+                Expr::Paren(p) => paren(self, *p.expr),
+                Expr::If(..)
+                | Expr::Unsafe(..)
+                | Expr::Block(..)
+                | Expr::IfLet(..) => {
                     return fold_expr(self, expr);
                 }
                 node => paren(self, node),
-            };
-
-            Expr { node: kind, ..expr }
+            }
         }
 
         fn fold_stmt(&mut self, stmt: Stmt) -> Stmt {
@@ -360,13 +358,11 @@
         fn fold_expr(&mut self, expr: Expr) -> Expr {
             self.0.push(expr);
 
-            Expr {
-                node: ExprKind::Tuple(ExprTuple {
-                    args: Delimited::new(),
-                    paren_token: token::Paren::default(),
-                }),
+            Expr::Tuple(ExprTuple {
                 attrs: vec![],
-            }
+                args: Delimited::new(),
+                paren_token: token::Paren::default(),
+            })
         }
     }