Parse async blocks as Expr::Async
diff --git a/src/expr.rs b/src/expr.rs
index 2b7aebb..1f99ea2 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -509,6 +509,16 @@
pub question_token: Token![?],
}),
+ /// An async block: `async { ... }`.
+ ///
+ /// *This type is available if Syn is built with the `"full"` feature.*
+ pub Async(ExprAsync #full {
+ pub attrs: Vec<Attribute>,
+ pub async_token: Token![async],
+ pub capture: Option<Token![move]>,
+ pub block: Block,
+ }),
+
/// A try block: `try { ... }`.
///
/// *This type is available if Syn is built with the `"full"` feature.*
@@ -600,6 +610,7 @@
| Expr::Paren(ExprParen { ref mut attrs, .. })
| Expr::Group(ExprGroup { ref mut attrs, .. })
| Expr::Try(ExprTry { ref mut attrs, .. })
+ | Expr::Async(ExprAsync { ref mut attrs, .. })
| Expr::TryBlock(ExprTryBlock { ref mut attrs, .. })
| Expr::Yield(ExprYield { ref mut attrs, .. }) => mem::replace(attrs, new),
Expr::Verbatim(_) => {
@@ -1008,6 +1019,7 @@
| Expr::WhileLet(..)
| Expr::Loop(..)
| Expr::ForLoop(..)
+ | Expr::Async(..)
| Expr::TryBlock(..) => false,
_ => true,
}
@@ -1571,7 +1583,7 @@
syn!(ExprLit) => { Expr::Lit } // must be before expr_struct
|
// must be before ExprStruct
- call!(unstable_async_block) => { Expr::Verbatim }
+ syn!(ExprAsync) => { Expr::Async }
|
// must be before ExprStruct
syn!(ExprTryBlock) => { Expr::TryBlock }
@@ -2134,17 +2146,20 @@
));
#[cfg(feature = "full")]
- named!(unstable_async_block -> ExprVerbatim, do_parse!(
- begin: call!(verbatim::grab_cursor) >>
- many0!(Attribute::parse_outer) >>
- keyword!(async) >>
- option!(keyword!(move)) >>
- syn!(Block) >>
- end: call!(verbatim::grab_cursor) >>
- (ExprVerbatim {
- tts: verbatim::token_range(begin..end),
- })
- ));
+ impl Synom for ExprAsync {
+ named!(parse -> Self, do_parse!(
+ attrs: many0!(Attribute::parse_outer) >>
+ async_token: keyword!(async) >>
+ capture: option!(keyword!(move)) >>
+ block: syn!(Block) >>
+ (ExprAsync {
+ attrs: attrs,
+ async_token: async_token,
+ capture: capture,
+ block: block,
+ })
+ ));
+ }
#[cfg(feature = "full")]
named!(fn_arg -> FnArg, do_parse!(
@@ -3395,6 +3410,16 @@
}
#[cfg(feature = "full")]
+ impl ToTokens for ExprAsync {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ outer_attrs_to_tokens(&self.attrs, tokens);
+ self.async_token.to_tokens(tokens);
+ self.capture.to_tokens(tokens);
+ self.block.to_tokens(tokens);
+ }
+ }
+
+ #[cfg(feature = "full")]
impl ToTokens for ExprTryBlock {
fn to_tokens(&self, tokens: &mut TokenStream) {
outer_attrs_to_tokens(&self.attrs, tokens);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 85d0ca8..b792053 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -132,6 +132,11 @@
fn fold_expr_assign_op(&mut self, i: ExprAssignOp) -> ExprAssignOp {
fold_expr_assign_op(self, i)
}
+ #[cfg(feature = "full")]
+ #[cfg(any(feature = "full", feature = "derive"))]
+ fn fold_expr_async(&mut self, i: ExprAsync) -> ExprAsync {
+ fold_expr_async(self, i)
+ }
#[cfg(any(feature = "full", feature = "derive"))]
fn fold_expr_binary(&mut self, i: ExprBinary) -> ExprBinary {
fold_expr_binary(self, i)
@@ -1206,6 +1211,7 @@
Expr::Paren(_binding_0) => Expr::Paren(_visitor.fold_expr_paren(_binding_0)),
Expr::Group(_binding_0) => Expr::Group(full!(_visitor.fold_expr_group(_binding_0))),
Expr::Try(_binding_0) => Expr::Try(full!(_visitor.fold_expr_try(_binding_0))),
+ Expr::Async(_binding_0) => Expr::Async(full!(_visitor.fold_expr_async(_binding_0))),
Expr::TryBlock(_binding_0) => {
Expr::TryBlock(full!(_visitor.fold_expr_try_block(_binding_0)))
}
@@ -1242,6 +1248,16 @@
right: Box::new(_visitor.fold_expr(*_i.right)),
}
}
+#[cfg(feature = "full")]
+#[cfg(any(feature = "full", feature = "derive"))]
+pub fn fold_expr_async<V: Fold + ?Sized>(_visitor: &mut V, _i: ExprAsync) -> ExprAsync {
+ ExprAsync {
+ attrs: FoldHelper::lift(_i.attrs, |it| _visitor.fold_attribute(it)),
+ async_token: Token),
+ capture: (_i.capture).map(|it| Token ! [ move ](tokens_helper(_visitor, &it.span))),
+ block: _visitor.fold_block(_i.block),
+ }
+}
#[cfg(any(feature = "full", feature = "derive"))]
pub fn fold_expr_binary<V: Fold + ?Sized>(_visitor: &mut V, _i: ExprBinary) -> ExprBinary {
ExprBinary {
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 596bd3e..9145591 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -132,6 +132,11 @@
fn visit_expr_assign_op(&mut self, i: &'ast ExprAssignOp) {
visit_expr_assign_op(self, i)
}
+ #[cfg(feature = "full")]
+ #[cfg(any(feature = "full", feature = "derive"))]
+ fn visit_expr_async(&mut self, i: &'ast ExprAsync) {
+ visit_expr_async(self, i)
+ }
#[cfg(any(feature = "full", feature = "derive"))]
fn visit_expr_binary(&mut self, i: &'ast ExprBinary) {
visit_expr_binary(self, i)
@@ -1256,6 +1261,9 @@
Expr::Try(ref _binding_0) => {
full!(_visitor.visit_expr_try(_binding_0));
}
+ Expr::Async(ref _binding_0) => {
+ full!(_visitor.visit_expr_async(_binding_0));
+ }
Expr::TryBlock(ref _binding_0) => {
full!(_visitor.visit_expr_try_block(_binding_0));
}
@@ -1302,6 +1310,18 @@
_visitor.visit_bin_op(&_i.op);
_visitor.visit_expr(&*_i.right);
}
+#[cfg(feature = "full")]
+#[cfg(any(feature = "full", feature = "derive"))]
+pub fn visit_expr_async<'ast, V: Visit<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprAsync) {
+ for it in &_i.attrs {
+ _visitor.visit_attribute(it)
+ }
+ tokens_helper(_visitor, &_i.async_token.span);
+ if let Some(ref it) = _i.capture {
+ tokens_helper(_visitor, &it.span)
+ };
+ _visitor.visit_block(&_i.block);
+}
#[cfg(any(feature = "full", feature = "derive"))]
pub fn visit_expr_binary<'ast, V: Visit<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprBinary) {
for it in &_i.attrs {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index cf6ca4f..428fd76 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -136,6 +136,11 @@
fn visit_expr_assign_op_mut(&mut self, i: &mut ExprAssignOp) {
visit_expr_assign_op_mut(self, i)
}
+ #[cfg(feature = "full")]
+ #[cfg(any(feature = "full", feature = "derive"))]
+ fn visit_expr_async_mut(&mut self, i: &mut ExprAsync) {
+ visit_expr_async_mut(self, i)
+ }
#[cfg(any(feature = "full", feature = "derive"))]
fn visit_expr_binary_mut(&mut self, i: &mut ExprBinary) {
visit_expr_binary_mut(self, i)
@@ -1254,6 +1259,9 @@
Expr::Try(ref mut _binding_0) => {
full!(_visitor.visit_expr_try_mut(_binding_0));
}
+ Expr::Async(ref mut _binding_0) => {
+ full!(_visitor.visit_expr_async_mut(_binding_0));
+ }
Expr::TryBlock(ref mut _binding_0) => {
full!(_visitor.visit_expr_try_block_mut(_binding_0));
}
@@ -1297,6 +1305,18 @@
_visitor.visit_bin_op_mut(&mut _i.op);
_visitor.visit_expr_mut(&mut *_i.right);
}
+#[cfg(feature = "full")]
+#[cfg(any(feature = "full", feature = "derive"))]
+pub fn visit_expr_async_mut<V: VisitMut + ?Sized>(_visitor: &mut V, _i: &mut ExprAsync) {
+ for it in &mut _i.attrs {
+ _visitor.visit_attribute_mut(it)
+ }
+ tokens_helper(_visitor, &mut _i.async_token.span);
+ if let Some(ref mut it) = _i.capture {
+ tokens_helper(_visitor, &mut it.span)
+ };
+ _visitor.visit_block_mut(&mut _i.block);
+}
#[cfg(any(feature = "full", feature = "derive"))]
pub fn visit_expr_binary_mut<V: VisitMut + ?Sized>(_visitor: &mut V, _i: &mut ExprBinary) {
for it in &mut _i.attrs {
diff --git a/src/lib.rs b/src/lib.rs
index 9f92989..b4d2c5c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -334,12 +334,12 @@
mod expr;
#[cfg(any(feature = "full", feature = "derive"))]
pub use expr::{
- Expr, ExprArray, ExprAssign, ExprAssignOp, ExprBinary, ExprBlock, ExprBox, ExprBreak, ExprCall,
- ExprCast, ExprClosure, ExprContinue, ExprField, ExprForLoop, ExprGroup, ExprIf, ExprIfLet,
- ExprInPlace, ExprIndex, ExprLit, ExprLoop, ExprMacro, ExprMatch, ExprMethodCall, ExprParen,
- ExprPath, ExprRange, ExprReference, ExprRepeat, ExprReturn, ExprStruct, ExprTry, ExprTryBlock,
- ExprTuple, ExprType, ExprUnary, ExprUnsafe, ExprVerbatim, ExprWhile, ExprWhileLet, ExprYield,
- Index, Member,
+ Expr, ExprArray, ExprAssign, ExprAssignOp, ExprAsync, ExprBinary, ExprBlock, ExprBox,
+ ExprBreak, ExprCall, ExprCast, ExprClosure, ExprContinue, ExprField, ExprForLoop, ExprGroup,
+ ExprIf, ExprIfLet, ExprInPlace, ExprIndex, ExprLit, ExprLoop, ExprMacro, ExprMatch,
+ ExprMethodCall, ExprParen, ExprPath, ExprRange, ExprReference, ExprRepeat, ExprReturn,
+ ExprStruct, ExprTry, ExprTryBlock, ExprTuple, ExprType, ExprUnary, ExprUnsafe, ExprVerbatim,
+ ExprWhile, ExprWhileLet, ExprYield, Index, Member,
};
#[cfg(feature = "full")]