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);