Inline closure capture and binding mode
diff --git a/src/expr.rs b/src/expr.rs
index b20af26..2213966 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -191,7 +191,7 @@
/// A closure (for example, `move |a, b, c| a + b + c`)
pub Closure(ExprClosure #full {
pub attrs: Vec<Attribute>,
- pub capture: CaptureBy,
+ pub capture: Option<Token![move]>,
pub or1_token: Token![|],
pub inputs: Delimited<FnArg, Token![,]>,
pub or2_token: Token![|],
@@ -573,7 +573,8 @@
/// field must be `None`). Disambiguation cannot be done with parser alone, so it happens
/// during name resolution.
pub Ident(PatIdent {
- pub mode: BindingMode,
+ pub mode: Option<Token![ref]>,
+ pub mutability: Mutability,
pub ident: Ident,
pub at_token: Option<Token![@]>,
pub subpat: Option<Box<Pat>>,
@@ -681,16 +682,6 @@
#[cfg(feature = "full")]
ast_enum! {
- /// A capture clause
- #[cfg_attr(feature = "clone-impls", derive(Copy))]
- pub enum CaptureBy {
- Value(Token![move]),
- Ref,
- }
-}
-
-#[cfg(feature = "full")]
-ast_enum! {
/// Limit types of a range (inclusive or exclusive)
#[cfg_attr(feature = "clone-impls", derive(Copy))]
pub enum RangeLimits {
@@ -718,15 +709,6 @@
}
}
-#[cfg(feature = "full")]
-ast_enum! {
- #[cfg_attr(feature = "clone-impls", derive(Copy))]
- pub enum BindingMode {
- ByRef(Token![ref], Mutability),
- ByValue(Mutability),
- }
-}
-
#[cfg(any(feature = "parsing", feature = "printing"))]
#[cfg(feature = "full")]
fn arm_expr_requires_comma(expr: &Expr) -> bool {
@@ -1648,7 +1630,7 @@
#[cfg(feature = "full")]
named!(expr_closure(allow_struct: bool) -> Expr, do_parse!(
- capture: syn!(CaptureBy) >>
+ capture: option!(keyword!(move)) >>
or1: punct!(|) >>
inputs: call!(Delimited::parse_terminated_with, fn_arg) >>
or2: punct!(|) >>
@@ -2116,10 +2098,8 @@
not!(punct!(::)) >>
subpat: option!(tuple!(punct!(@), syn!(Pat))) >>
(PatIdent {
- mode: match mode {
- Some(mode) => BindingMode::ByRef(mode, mutability),
- None => BindingMode::ByValue(mutability),
- },
+ mode: mode,
+ mutability: mutability,
ident: name,
at_token: subpat.as_ref().map(|p| Token.0)),
subpat: subpat.map(|p| Box::new(p.1)),
@@ -2182,11 +2162,8 @@
ident: syn!(Ident) >>
({
let mut pat: Pat = PatIdent {
- mode: if let Some(mode) = mode {
- BindingMode::ByRef(mode, mutability)
- } else {
- BindingMode::ByValue(mutability)
- },
+ mode: mode,
+ mutability: mutability,
ident: ident,
subpat: None,
at_token: None,
@@ -2379,15 +2356,6 @@
}
));
}
-
- #[cfg(feature = "full")]
- impl Synom for CaptureBy {
- named!(parse -> Self, alt!(
- keyword!(move) => { CaptureBy::Value }
- |
- epsilon!() => { |_| CaptureBy::Ref }
- ));
- }
}
#[cfg(feature = "printing")]
@@ -2960,6 +2928,7 @@
impl ToTokens for PatIdent {
fn to_tokens(&self, tokens: &mut Tokens) {
self.mode.to_tokens(tokens);
+ self.mutability.to_tokens(tokens);
self.ident.to_tokens(tokens);
if self.subpat.is_some() {
TokensOrDefault(&self.at_token).to_tokens(tokens);
@@ -3103,33 +3072,6 @@
}
#[cfg(feature = "full")]
- impl ToTokens for BindingMode {
- fn to_tokens(&self, tokens: &mut Tokens) {
- match *self {
- BindingMode::ByRef(ref t, ref m) => {
- t.to_tokens(tokens);
- m.to_tokens(tokens);
- }
- BindingMode::ByValue(ref m) => {
- m.to_tokens(tokens);
- }
- }
- }
- }
-
- #[cfg(feature = "full")]
- impl ToTokens for CaptureBy {
- fn to_tokens(&self, tokens: &mut Tokens) {
- match *self {
- CaptureBy::Value(ref t) => t.to_tokens(tokens),
- CaptureBy::Ref => {
- // nothing
- }
- }
- }
- }
-
- #[cfg(feature = "full")]
impl ToTokens for Block {
fn to_tokens(&self, tokens: &mut Tokens) {
self.brace_token.surround(tokens, |tokens| {
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 192cc6d..e623a0e 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -66,8 +66,6 @@
fn fold_bin_op(&mut self, i: BinOp) -> BinOp { fold_bin_op(self, i) }
# [ cfg ( feature = "full" ) ]
-fn fold_binding_mode(&mut self, i: BindingMode) -> BindingMode { fold_binding_mode(self, i) }
-# [ cfg ( feature = "full" ) ]
fn fold_block(&mut self, i: Block) -> Block { fold_block(self, i) }
fn fold_body(&mut self, i: Body) -> Body { fold_body(self, i) }
@@ -77,8 +75,6 @@
fn fold_body_struct(&mut self, i: BodyStruct) -> BodyStruct { fold_body_struct(self, i) }
fn fold_bound_lifetimes(&mut self, i: BoundLifetimes) -> BoundLifetimes { fold_bound_lifetimes(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn fold_capture_by(&mut self, i: CaptureBy) -> CaptureBy { fold_capture_by(self, i) }
fn fold_const_param(&mut self, i: ConstParam) -> ConstParam { fold_const_param(self, i) }
# [ cfg ( feature = "full" ) ]
@@ -683,23 +679,6 @@
}
}
# [ cfg ( feature = "full" ) ]
-pub fn fold_binding_mode<V: Folder + ?Sized>(_visitor: &mut V, _i: BindingMode) -> BindingMode {
- use ::BindingMode::*;
- match _i {
- ByRef(_binding_0, _binding_1, ) => {
- ByRef (
- Token ! [ ref ](tokens_helper(_visitor, &(_binding_0).0)),
- _visitor.fold_mutability(_binding_1),
- )
- }
- ByValue(_binding_0, ) => {
- ByValue (
- _visitor.fold_mutability(_binding_0),
- )
- }
- }
-}
-# [ cfg ( feature = "full" ) ]
pub fn fold_block<V: Folder + ?Sized>(_visitor: &mut V, _i: Block) -> Block {
Block {
brace_token: Brace(tokens_helper(_visitor, &(_i . brace_token).0)),
@@ -747,18 +726,6 @@
gt_token: Token ! [ > ](tokens_helper(_visitor, &(_i . gt_token).0)),
}
}
-# [ cfg ( feature = "full" ) ]
-pub fn fold_capture_by<V: Folder + ?Sized>(_visitor: &mut V, _i: CaptureBy) -> CaptureBy {
- use ::CaptureBy::*;
- match _i {
- Value(_binding_0, ) => {
- Value (
- Token ! [ move ](tokens_helper(_visitor, &(_binding_0).0)),
- )
- }
- Ref => { Ref }
- }
-}
pub fn fold_const_param<V: Folder + ?Sized>(_visitor: &mut V, _i: ConstParam) -> ConstParam {
ConstParam {
@@ -1105,7 +1072,7 @@
pub fn fold_expr_closure<V: Folder + ?Sized>(_visitor: &mut V, _i: ExprClosure) -> ExprClosure {
ExprClosure {
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
- capture: _visitor.fold_capture_by(_i . capture),
+ capture: (_i . capture).map(|it| { Token ! [ move ](tokens_helper(_visitor, &(it).0)) }),
or1_token: Token ! [ | ](tokens_helper(_visitor, &(_i . or1_token).0)),
inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_fn_arg(it) }),
or2_token: Token ! [ | ](tokens_helper(_visitor, &(_i . or2_token).0)),
@@ -2188,7 +2155,8 @@
# [ cfg ( feature = "full" ) ]
pub fn fold_pat_ident<V: Folder + ?Sized>(_visitor: &mut V, _i: PatIdent) -> PatIdent {
PatIdent {
- mode: _visitor.fold_binding_mode(_i . mode),
+ mode: (_i . mode).map(|it| { Token ! [ ref ](tokens_helper(_visitor, &(it).0)) }),
+ mutability: _visitor.fold_mutability(_i . mutability),
ident: _visitor.fold_ident(_i . ident),
at_token: (_i . at_token).map(|it| { Token ! [ @ ](tokens_helper(_visitor, &(it).0)) }),
subpat: (_i . subpat).map(|it| { Box::new(_visitor.fold_pat(* it)) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 891eeaa..bf8739e 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -62,8 +62,6 @@
fn visit_bin_op(&mut self, i: &'ast BinOp) { visit_bin_op(self, i) }
# [ cfg ( feature = "full" ) ]
-fn visit_binding_mode(&mut self, i: &'ast BindingMode) { visit_binding_mode(self, i) }
-# [ cfg ( feature = "full" ) ]
fn visit_block(&mut self, i: &'ast Block) { visit_block(self, i) }
fn visit_body(&mut self, i: &'ast Body) { visit_body(self, i) }
@@ -73,8 +71,6 @@
fn visit_body_struct(&mut self, i: &'ast BodyStruct) { visit_body_struct(self, i) }
fn visit_bound_lifetimes(&mut self, i: &'ast BoundLifetimes) { visit_bound_lifetimes(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_capture_by(&mut self, i: &'ast CaptureBy) { visit_capture_by(self, i) }
fn visit_const_param(&mut self, i: &'ast ConstParam) { visit_const_param(self, i) }
# [ cfg ( feature = "full" ) ]
@@ -587,19 +583,6 @@
}
}
# [ cfg ( feature = "full" ) ]
-pub fn visit_binding_mode<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast BindingMode) {
- use ::BindingMode::*;
- match *_i {
- ByRef(ref _binding_0, ref _binding_1, ) => {
- tokens_helper(_visitor, &(_binding_0).0);
- _visitor.visit_mutability(_binding_1);
- }
- ByValue(ref _binding_0, ) => {
- _visitor.visit_mutability(_binding_0);
- }
- }
-}
-# [ cfg ( feature = "full" ) ]
pub fn visit_block<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Block) {
tokens_helper(_visitor, &(& _i . brace_token).0);
for it in & _i . stmts { _visitor.visit_stmt(it) };
@@ -635,16 +618,6 @@
for el in & _i . lifetimes { let it = el.item(); _visitor.visit_lifetime_def(it) };
tokens_helper(_visitor, &(& _i . gt_token).0);
}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_capture_by<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast CaptureBy) {
- use ::CaptureBy::*;
- match *_i {
- Value(ref _binding_0, ) => {
- tokens_helper(_visitor, &(_binding_0).0);
- }
- Ref => { }
- }
-}
pub fn visit_const_param<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ConstParam) {
for it in & _i . attrs { _visitor.visit_attribute(it) };
@@ -882,7 +855,7 @@
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_closure<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprClosure) {
for it in & _i . attrs { _visitor.visit_attribute(it) };
- _visitor.visit_capture_by(& _i . capture);
+ if let Some(ref it) = _i . capture { tokens_helper(_visitor, &(it).0) };
tokens_helper(_visitor, &(& _i . or1_token).0);
for el in & _i . inputs { let it = el.item(); _visitor.visit_fn_arg(it) };
tokens_helper(_visitor, &(& _i . or2_token).0);
@@ -1721,7 +1694,8 @@
}
# [ cfg ( feature = "full" ) ]
pub fn visit_pat_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PatIdent) {
- _visitor.visit_binding_mode(& _i . mode);
+ if let Some(ref it) = _i . mode { tokens_helper(_visitor, &(it).0) };
+ _visitor.visit_mutability(& _i . mutability);
_visitor.visit_ident(& _i . ident);
if let Some(ref it) = _i . at_token { tokens_helper(_visitor, &(it).0) };
if let Some(ref it) = _i . subpat { _visitor.visit_pat(& * * it) };
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 2de70b6..6debf1d 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -62,8 +62,6 @@
fn visit_bin_op_mut(&mut self, i: &mut BinOp) { visit_bin_op_mut(self, i) }
# [ cfg ( feature = "full" ) ]
-fn visit_binding_mode_mut(&mut self, i: &mut BindingMode) { visit_binding_mode_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
fn visit_block_mut(&mut self, i: &mut Block) { visit_block_mut(self, i) }
fn visit_body_mut(&mut self, i: &mut Body) { visit_body_mut(self, i) }
@@ -73,8 +71,6 @@
fn visit_body_struct_mut(&mut self, i: &mut BodyStruct) { visit_body_struct_mut(self, i) }
fn visit_bound_lifetimes_mut(&mut self, i: &mut BoundLifetimes) { visit_bound_lifetimes_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
-fn visit_capture_by_mut(&mut self, i: &mut CaptureBy) { visit_capture_by_mut(self, i) }
fn visit_const_param_mut(&mut self, i: &mut ConstParam) { visit_const_param_mut(self, i) }
# [ cfg ( feature = "full" ) ]
@@ -587,19 +583,6 @@
}
}
# [ cfg ( feature = "full" ) ]
-pub fn visit_binding_mode_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut BindingMode) {
- use ::BindingMode::*;
- match *_i {
- ByRef(ref mut _binding_0, ref mut _binding_1, ) => {
- tokens_helper(_visitor, &mut (_binding_0).0);
- _visitor.visit_mutability_mut(_binding_1);
- }
- ByValue(ref mut _binding_0, ) => {
- _visitor.visit_mutability_mut(_binding_0);
- }
- }
-}
-# [ cfg ( feature = "full" ) ]
pub fn visit_block_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Block) {
tokens_helper(_visitor, &mut (& mut _i . brace_token).0);
for it in & mut _i . stmts { _visitor.visit_stmt_mut(it) };
@@ -635,16 +618,6 @@
for mut el in & mut _i . lifetimes { let it = el.item_mut(); _visitor.visit_lifetime_def_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . gt_token).0);
}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_capture_by_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut CaptureBy) {
- use ::CaptureBy::*;
- match *_i {
- Value(ref mut _binding_0, ) => {
- tokens_helper(_visitor, &mut (_binding_0).0);
- }
- Ref => { }
- }
-}
pub fn visit_const_param_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ConstParam) {
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
@@ -882,7 +855,7 @@
# [ cfg ( feature = "full" ) ]
pub fn visit_expr_closure_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprClosure) {
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
- _visitor.visit_capture_by_mut(& mut _i . capture);
+ if let Some(ref mut it) = _i . capture { tokens_helper(_visitor, &mut (it).0) };
tokens_helper(_visitor, &mut (& mut _i . or1_token).0);
for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_fn_arg_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . or2_token).0);
@@ -1721,7 +1694,8 @@
}
# [ cfg ( feature = "full" ) ]
pub fn visit_pat_ident_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut PatIdent) {
- _visitor.visit_binding_mode_mut(& mut _i . mode);
+ if let Some(ref mut it) = _i . mode { tokens_helper(_visitor, &mut (it).0) };
+ _visitor.visit_mutability_mut(& mut _i . mutability);
_visitor.visit_ident_mut(& mut _i . ident);
if let Some(ref mut it) = _i . at_token { tokens_helper(_visitor, &mut (it).0) };
if let Some(ref mut it) = _i . subpat { _visitor.visit_pat_mut(& mut * * it) };
diff --git a/src/lib.rs b/src/lib.rs
index 71f47cc..7c5cde1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -41,7 +41,7 @@
ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield, Index, Member};
#[cfg(feature = "full")]
-pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Local,
+pub use expr::{Arm, Block, FieldPat, FieldValue, GenericMethodArgument, Local,
MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
PatStruct, PatTuple, PatTupleStruct, PatWild, RangeLimits, Stmt};