Do not reuse FnDecl for closures
diff --git a/src/expr.rs b/src/expr.rs
index cec6dc2..0b8f4ee 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -200,10 +200,11 @@
/// A closure (for example, `move |a, b, c| a + b + c`)
pub Closure(ExprClosure #full {
pub capture: CaptureBy,
- pub decl: Box<FnDecl>,
- pub body: Box<Expr>,
pub or1_token: Token![|],
+ pub inputs: Delimited<FnArg, Token![,]>,
pub or2_token: Token![|],
+ pub output: ReturnType,
+ pub body: Box<Expr>,
}),
/// An unsafe block (`unsafe { ... }`)
@@ -1556,7 +1557,7 @@
arrow: punct!(->) >>
ty: syn!(Type) >>
body: syn!(Block) >>
- (ReturnType::Type(ty, arrow),
+ (ReturnType::Type(Box::new(ty), arrow),
ExprKind::Block(ExprBlock {
block: body,
}).into())
@@ -1567,16 +1568,9 @@
(ExprClosure {
capture: capture,
or1_token: or1,
+ inputs: inputs,
or2_token: or2,
- decl: Box::new(FnDecl {
- inputs: inputs,
- output: ret_and_body.0,
- variadic: false,
- dot_tokens: None,
- fn_token: <Token![fn]>::default(),
- generics: Generics::default(),
- paren_token: token::Paren::default(),
- }),
+ output: ret_and_body.0,
body: Box::new(ret_and_body.1),
}.into())
));
@@ -2587,7 +2581,7 @@
fn to_tokens(&self, tokens: &mut Tokens) {
self.capture.to_tokens(tokens);
self.or1_token.to_tokens(tokens);
- for item in self.decl.inputs.iter() {
+ for item in self.inputs.iter() {
match **item.item() {
FnArg::Captured(ArgCaptured {
ref pat,
@@ -2601,7 +2595,7 @@
item.delimiter().to_tokens(tokens);
}
self.or2_token.to_tokens(tokens);
- self.decl.output.to_tokens(tokens);
+ self.output.to_tokens(tokens);
self.body.to_tokens(tokens);
}
}
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index c8f1ae4..c07f6bf 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -904,10 +904,11 @@
pub fn fold_expr_closure<V: Folder + ?Sized>(_visitor: &mut V, _i: ExprClosure) -> ExprClosure {
ExprClosure {
capture: _visitor.fold_capture_by(_i . capture),
- decl: Box::new(_visitor.fold_fn_decl(* _i . decl)),
- body: Box::new(_visitor.fold_expr(* _i . body)),
or1_token: _i . or1_token,
+ inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_fn_arg(it) }),
or2_token: _i . or2_token,
+ output: _visitor.fold_return_type(_i . output),
+ body: Box::new(_visitor.fold_expr(* _i . body)),
}
}
# [ cfg ( feature = "full" ) ]
@@ -2285,7 +2286,7 @@
Default => { Default }
Type(_binding_0, _binding_1, ) => {
Type (
- _visitor.fold_type(_binding_0),
+ Box::new(_visitor.fold_type(* _binding_0)),
_binding_1,
)
}
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 72d955d..cdfefe3 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -745,10 +745,11 @@
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_closure<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprClosure) {
_visitor.visit_capture_by(& _i . capture);
- _visitor.visit_fn_decl(& _i . decl);
- _visitor.visit_expr(& _i . body);
// Skipped field _i . or1_token;
+ for el in & _i . inputs { let it = el.item(); _visitor.visit_fn_arg(it) };
// Skipped field _i . or2_token;
+ _visitor.visit_return_type(& _i . output);
+ _visitor.visit_expr(& _i . body);
}
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_continue<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprContinue) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index cc31959..a6afbf9 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -745,10 +745,11 @@
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_closure_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprClosure) {
_visitor.visit_capture_by_mut(& mut _i . capture);
- _visitor.visit_fn_decl_mut(& mut _i . decl);
- _visitor.visit_expr_mut(& mut _i . body);
// Skipped field _i . or1_token;
+ for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_fn_arg_mut(it) };
// Skipped field _i . or2_token;
+ _visitor.visit_return_type_mut(& mut _i . output);
+ _visitor.visit_expr_mut(& mut _i . body);
}
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_continue_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprContinue) {
diff --git a/src/ty.rs b/src/ty.rs
index 2fe4ecf..09ee041 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -339,7 +339,7 @@
/// type would be inserted.
Default,
/// Everything else
- Type(Type, Token![->]),
+ Type(Box<Type>, Token![->]),
}
}
@@ -597,7 +597,7 @@
do_parse!(
arrow: punct!(->) >>
ty: syn!(Type) >>
- (ReturnType::Type(ty, arrow))
+ (ReturnType::Type(Box::new(ty), arrow))
)
|
epsilon!() => { |_| ReturnType::Default }