Support Expr::Type with full feature only
diff --git a/src/expr.rs b/src/expr.rs
index 8b781b5..6a4fc69 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -93,7 +93,7 @@
         }),
 
         /// A type ascription, e.g. `foo: f64`.
-        pub Type(ExprType {
+        pub Type(ExprType #full {
             pub attrs: Vec<Attribute>,
             pub expr: Box<Expr>,
             pub colon_token: Token![:],
@@ -1035,6 +1035,7 @@
 
     // <unary> as <ty>
     // <unary> : <ty>
+    #[cfg(feature = "full")]
     named!(cast_expr(allow_struct: bool, allow_block: bool) -> Expr, do_parse!(
         mut e: call!(unary_expr, allow_struct, allow_block) >>
         many0!(alt!(
@@ -1071,6 +1072,27 @@
         (e)
     ));
 
+    // <unary> as <ty>
+    #[cfg(not(feature = "full"))]
+    named!(cast_expr(allow_struct: bool, allow_block: bool) -> Expr, do_parse!(
+        mut e: call!(unary_expr, allow_struct, allow_block) >>
+        many0!(do_parse!(
+            as_: keyword!(as) >>
+            // We can't accept `A + B` in cast expressions, as it's
+            // ambiguous with the + expression.
+            ty: call!(Type::without_plus) >>
+            ({
+                e = ExprCast {
+                    attrs: Vec::new(),
+                    expr: Box::new(e.into()),
+                    as_token: as_,
+                    ty: Box::new(ty),
+                }.into();
+            })
+        )) >>
+        (e)
+    ));
+
     // <UnOp> <trailer>
     // & <trailer>
     // &mut <trailer>
@@ -2490,6 +2512,7 @@
         }
     }
 
+    #[cfg(feature = "full")]
     impl ToTokens for ExprType {
         fn to_tokens(&self, tokens: &mut Tokens) {
             attrs_to_tokens(&self.attrs, tokens);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 566a2ce..8f45209 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -155,7 +155,7 @@
 fn fold_expr_try(&mut self, i: ExprTry) -> ExprTry { fold_expr_try(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_expr_tuple(&mut self, i: ExprTuple) -> ExprTuple { fold_expr_tuple(self, i) }
-
+# [ cfg ( feature = "full" ) ]
 fn fold_expr_type(&mut self, i: ExprType) -> ExprType { fold_expr_type(self, i) }
 
 fn fold_expr_unary(&mut self, i: ExprUnary) -> ExprUnary { fold_expr_unary(self, i) }
@@ -847,7 +847,7 @@
         }
         Type(_binding_0, ) => {
             Type (
-                _visitor.fold_expr_type(_binding_0),
+                full!(_visitor.fold_expr_type(_binding_0)),
             )
         }
         If(_binding_0, ) => {
@@ -1299,7 +1299,7 @@
         elems: FoldHelper::lift(_i . elems, |it| { _visitor.fold_expr(it) }),
     }
 }
-
+# [ cfg ( feature = "full" ) ]
 pub fn fold_expr_type<V: Folder + ?Sized>(_visitor: &mut V, _i: ExprType) -> ExprType {
     ExprType {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index b4464d8..cef26ae 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -151,7 +151,7 @@
 fn visit_expr_try(&mut self, i: &'ast ExprTry) { visit_expr_try(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_expr_tuple(&mut self, i: &'ast ExprTuple) { visit_expr_tuple(self, i) }
-
+# [ cfg ( feature = "full" ) ]
 fn visit_expr_type(&mut self, i: &'ast ExprType) { visit_expr_type(self, i) }
 
 fn visit_expr_unary(&mut self, i: &'ast ExprUnary) { visit_expr_unary(self, i) }
@@ -714,7 +714,7 @@
             _visitor.visit_expr_cast(_binding_0);
         }
         Type(ref _binding_0, ) => {
-            _visitor.visit_expr_type(_binding_0);
+            full!(_visitor.visit_expr_type(_binding_0));
         }
         If(ref _binding_0, ) => {
             full!(_visitor.visit_expr_if(_binding_0));
@@ -1043,7 +1043,7 @@
     tokens_helper(_visitor, &(& _i . paren_token).0);
     for el in & _i . elems { let it = el.item(); _visitor.visit_expr(it) };
 }
-
+# [ cfg ( feature = "full" ) ]
 pub fn visit_expr_type<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprType) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_expr(& * _i . expr);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index c07256f..b8ec433 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -151,7 +151,7 @@
 fn visit_expr_try_mut(&mut self, i: &mut ExprTry) { visit_expr_try_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_expr_tuple_mut(&mut self, i: &mut ExprTuple) { visit_expr_tuple_mut(self, i) }
-
+# [ cfg ( feature = "full" ) ]
 fn visit_expr_type_mut(&mut self, i: &mut ExprType) { visit_expr_type_mut(self, i) }
 
 fn visit_expr_unary_mut(&mut self, i: &mut ExprUnary) { visit_expr_unary_mut(self, i) }
@@ -714,7 +714,7 @@
             _visitor.visit_expr_cast_mut(_binding_0);
         }
         Type(ref mut _binding_0, ) => {
-            _visitor.visit_expr_type_mut(_binding_0);
+            full!(_visitor.visit_expr_type_mut(_binding_0));
         }
         If(ref mut _binding_0, ) => {
             full!(_visitor.visit_expr_if_mut(_binding_0));
@@ -1043,7 +1043,7 @@
     tokens_helper(_visitor, &mut (& mut _i . paren_token).0);
     for mut el in & mut _i . elems { let it = el.item_mut(); _visitor.visit_expr_mut(it) };
 }
-
+# [ cfg ( feature = "full" ) ]
 pub fn visit_expr_type_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprType) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_expr_mut(& mut * _i . expr);