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| {