@@ -1090,7 +1090,7 @@ fn make_call(ctx: &AssistContext, fun: &Function, indent: IndentLevel) -> String
1090
1090
1091
1091
let args = make:: arg_list ( fun. params . iter ( ) . map ( |param| param. to_arg ( ctx) ) ) ;
1092
1092
let name = fun. name . clone ( ) ;
1093
- let call_expr = if fun. self_param . is_some ( ) {
1093
+ let mut call_expr = if fun. self_param . is_some ( ) {
1094
1094
let self_arg = make:: expr_path ( make:: ext:: ident_path ( "self" ) ) ;
1095
1095
make:: expr_method_call ( self_arg, name, args)
1096
1096
} else {
@@ -1100,6 +1100,9 @@ fn make_call(ctx: &AssistContext, fun: &Function, indent: IndentLevel) -> String
1100
1100
1101
1101
let handler = FlowHandler :: from_ret_ty ( fun, & ret_ty) ;
1102
1102
1103
+ if fun. control_flow . is_async {
1104
+ call_expr = make:: expr_await ( call_expr) ;
1105
+ }
1103
1106
let expr = handler. make_call_expr ( call_expr) . indent ( indent) ;
1104
1107
1105
1108
let mut_modifier = |var : & OutlivedLocal | if var. mut_usage_outside_body { "mut " } else { "" } ;
@@ -1119,10 +1122,8 @@ fn make_call(ctx: &AssistContext, fun: &Function, indent: IndentLevel) -> String
1119
1122
buf. push_str ( ") = " ) ;
1120
1123
}
1121
1124
}
1125
+
1122
1126
format_to ! ( buf, "{}" , expr) ;
1123
- if fun. control_flow . is_async {
1124
- buf. push_str ( ".await" ) ;
1125
- }
1126
1127
let insert_comma = fun
1127
1128
. body
1128
1129
. parent ( )
@@ -3870,6 +3871,70 @@ async fn $0fun_name() {
3870
3871
3871
3872
async fn some_function() {
3872
3873
3874
+ }
3875
+ "# ,
3876
+ ) ;
3877
+ }
3878
+
3879
+ #[ test]
3880
+ fn extract_with_await_and_result_not_producing_match_expr ( ) {
3881
+ check_assist (
3882
+ extract_function,
3883
+ r#"
3884
+ async fn foo() -> Result<(), ()> {
3885
+ $0async {}.await;
3886
+ Err(())?$0
3887
+ }
3888
+ "# ,
3889
+ r#"
3890
+ async fn foo() -> Result<(), ()> {
3891
+ fun_name().await?
3892
+ }
3893
+
3894
+ async fn $0fun_name() -> _ {
3895
+ async {}.await;
3896
+ Err(())?
3897
+ }
3898
+ "# ,
3899
+ ) ;
3900
+ }
3901
+
3902
+ #[ test]
3903
+ fn extract_with_await_and_result_producing_match_expr ( ) {
3904
+ check_assist (
3905
+ extract_function,
3906
+ r#"
3907
+ async fn foo() -> i32 {
3908
+ loop {
3909
+ let n = 1;$0
3910
+ let k = async { 1 }.await;
3911
+ if k == 42 {
3912
+ break 3;
3913
+ }
3914
+ let m = k + 1;$0
3915
+ let h = 1 + m;
3916
+ }
3917
+ }
3918
+ "# ,
3919
+ r#"
3920
+ async fn foo() -> i32 {
3921
+ loop {
3922
+ let n = 1;
3923
+ let m = match fun_name().await {
3924
+ Ok(value) => value,
3925
+ Err(value) => break value,
3926
+ };
3927
+ let h = 1 + m;
3928
+ }
3929
+ }
3930
+
3931
+ async fn $0fun_name() -> Result<i32, i32> {
3932
+ let k = async { 1 }.await;
3933
+ if k == 42 {
3934
+ return Err(3);
3935
+ }
3936
+ let m = k + 1;
3937
+ Ok(m)
3873
3938
}
3874
3939
"# ,
3875
3940
) ;
0 commit comments