11use clippy_utils:: diagnostics:: span_lint_hir_and_then;
2- use clippy_utils:: source:: { snippet, walk_span_to_context} ;
2+ use clippy_utils:: is_expr_async_block;
3+ use clippy_utils:: source:: walk_span_to_context;
4+ use clippy_utils:: sugg:: Sugg ;
35use clippy_utils:: ty:: implements_trait;
46use rustc_errors:: Applicability ;
57use rustc_hir:: { Closure , ClosureKind , CoroutineDesugaring , CoroutineKind , CoroutineSource , Expr , ExprKind , QPath } ;
@@ -87,15 +89,22 @@ impl<'tcx> LateLintPass<'tcx> for AsyncYieldsAsync {
8789 let expr_ty = typeck_results. expr_ty ( body_expr) ;
8890
8991 if implements_trait ( cx, expr_ty, future_trait_def_id, & [ ] ) {
90- let return_expr_span = match & body_expr. kind {
92+ let return_expr = match & body_expr. kind {
9193 // XXXkhuey there has to be a better way.
92- ExprKind :: Block ( block, _) => block. expr . map ( |e| e . span ) ,
93- ExprKind :: Path ( QPath :: Resolved ( _, path) ) => Some ( path. span ) ,
94+ ExprKind :: Block ( block, _) => block. expr . map ( |e| ( e , e . span ) ) ,
95+ ExprKind :: Path ( QPath :: Resolved ( _, path) ) => Some ( ( body_expr , path. span ) ) ,
9496 _ => None ,
9597 } ;
96- if let Some ( return_expr_span) = return_expr_span {
98+ if let Some ( ( return_expr , return_expr_span) ) = return_expr {
9799 let return_expr_span =
98100 walk_span_to_context ( return_expr_span, expr. span . ctxt ( ) ) . unwrap_or ( return_expr_span) ;
101+ let mut applicability = Applicability :: MaybeIncorrect ;
102+ let mut return_expr_snip =
103+ Sugg :: hir_with_context ( cx, return_expr, expr. span . ctxt ( ) , ".." , & mut applicability) ;
104+ if !is_expr_async_block ( return_expr) {
105+ return_expr_snip = return_expr_snip. maybe_paren ( ) ;
106+ }
107+
99108 span_lint_hir_and_then (
100109 cx,
101110 ASYNC_YIELDS_ASYNC ,
@@ -108,8 +117,8 @@ impl<'tcx> LateLintPass<'tcx> for AsyncYieldsAsync {
108117 db. span_suggestion (
109118 return_expr_span,
110119 "consider awaiting this value" ,
111- format ! ( "{}.await" , snippet ( cx , return_expr_span , ".." ) ) ,
112- Applicability :: MaybeIncorrect ,
120+ format ! ( "{}.await" , return_expr_snip ) ,
121+ applicability ,
113122 ) ;
114123 } ,
115124 ) ;
0 commit comments