diff --git a/src/expr.rs b/src/expr.rs index 6814b91e053..05020a419a9 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -345,8 +345,27 @@ pub fn format_expr( } // FIXME(#2743) ast::ExprKind::ObsoleteInPlace(..) => unimplemented!(), - // FIXME(topecongiro) Format async block. - ast::ExprKind::Async(..) => None, + ast::ExprKind::Async(_capture_by, _node_id, ref block) => { + if let rw @ Some(_) = + rewrite_single_line_block(context, "async ", block, Some(&expr.attrs), None, shape) + { + rw + } else { + // 6 = `async ` + let budget = shape.width.saturating_sub(6); + Some(format!( + "{}{}", + "async ", + rewrite_block( + block, + Some(&expr.attrs), + None, + context, + Shape::legacy(budget, shape.indent) + )? + )) + } + } }; expr_rw diff --git a/src/items.rs b/src/items.rs index 8c32d393df4..3076082d037 100644 --- a/src/items.rs +++ b/src/items.rs @@ -164,6 +164,7 @@ pub struct FnSig<'a> { decl: &'a ast::FnDecl, generics: &'a ast::Generics, abi: abi::Abi, + asyncness: ast::IsAsync, constness: ast::Constness, defaultness: ast::Defaultness, unsafety: ast::Unsafety, @@ -180,6 +181,7 @@ impl<'a> FnSig<'a> { decl, generics, abi: abi::Abi::Rust, + asyncness: ast::IsAsync::NotAsync, constness: ast::Constness::NotConst, defaultness: ast::Defaultness::Final, unsafety: ast::Unsafety::Normal, @@ -193,6 +195,7 @@ impl<'a> FnSig<'a> { ) -> FnSig<'a> { FnSig { unsafety: method_sig.header.unsafety, + asyncness: method_sig.header.asyncness, constness: method_sig.header.constness.node, defaultness: ast::Defaultness::Final, abi: method_sig.header.abi, @@ -214,6 +217,7 @@ impl<'a> FnSig<'a> { generics, abi: fn_header.abi, constness: fn_header.constness.node, + asyncness: fn_header.asyncness, defaultness, unsafety: fn_header.unsafety, visibility: visibility.clone(), @@ -235,6 +239,7 @@ impl<'a> FnSig<'a> { // Vis defaultness constness unsafety abi. result.push_str(&*format_visibility(context, &self.visibility)); result.push_str(format_defaultness(self.defaultness)); + result.push_str(format_asyncness(self.asyncness)); result.push_str(format_constness(self.constness)); result.push_str(format_unsafety(self.unsafety)); result.push_str(&format_abi( diff --git a/src/utils.rs b/src/utils.rs index b8474792cd3..3dbffd6d175 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -81,6 +81,14 @@ pub fn format_visibility(context: &RewriteContext, vis: &Visibility) -> Cow<'sta } } +#[inline] +pub fn format_asyncness(asyncness: ast::IsAsync) -> &'static str { + match asyncness { + ast::IsAsync::Async { .. } => "async ", + ast::IsAsync::NotAsync => "", + } +} + #[inline] pub fn format_constness(constness: ast::Constness) -> &'static str { match constness { diff --git a/src/visitor.rs b/src/visitor.rs index fdbc9907f22..903fe039b1b 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -253,7 +253,6 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { // Note that this only gets called for function definitions. Required methods // on traits do not get handled here. - // FIXME(topecongiro) Format async fn (#2812). fn visit_fn( &mut self, fk: visit::FnKind,