@@ -40,28 +40,34 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_>)
4040 return None ;
4141 }
4242 let space_before_guard = guard. syntax ( ) . prev_sibling_or_token ( ) ;
43+ let space_after_arrow = match_arm. fat_arrow_token ( ) ?. next_sibling_or_token ( ) ;
4344
44- let guard_condition = guard. condition ( ) ?;
45+ let guard_condition = guard. condition ( ) ?. reset_indent ( ) ;
4546 let arm_expr = match_arm. expr ( ) ?;
46- let if_expr =
47- make:: expr_if ( guard_condition, make:: block_expr ( None , Some ( arm_expr. clone ( ) ) ) , None )
48- . indent ( arm_expr. indent_level ( ) ) ;
47+ let then_branch = make:: block_expr ( None , Some ( arm_expr. reset_indent ( ) . indent ( 1 . into ( ) ) ) ) ;
48+ let if_expr = make:: expr_if ( guard_condition, then_branch, None ) . indent ( arm_expr. indent_level ( ) ) ;
4949
5050 let target = guard. syntax ( ) . text_range ( ) ;
5151 acc. add (
5252 AssistId :: refactor_rewrite ( "move_guard_to_arm_body" ) ,
5353 "Move guard to arm body" ,
5454 target,
55- |edit| {
56- match space_before_guard {
57- Some ( element) if element. kind ( ) == WHITESPACE => {
58- edit. delete ( element. text_range ( ) ) ;
59- }
60- _ => ( ) ,
61- } ;
55+ |builder| {
56+ let mut edit = builder. make_editor ( match_arm. syntax ( ) ) ;
57+ if let Some ( element) = space_before_guard
58+ && element. kind ( ) == WHITESPACE
59+ {
60+ edit. delete ( element) ;
61+ }
62+ if let Some ( element) = space_after_arrow
63+ && element. kind ( ) == WHITESPACE
64+ {
65+ edit. replace ( element, make:: tokens:: single_space ( ) ) ;
66+ }
6267
63- edit. delete ( guard. syntax ( ) . text_range ( ) ) ;
64- edit. replace_ast ( arm_expr, if_expr. into ( ) ) ;
68+ edit. delete ( guard. syntax ( ) ) ;
69+ edit. replace ( arm_expr. syntax ( ) , if_expr. syntax ( ) ) ;
70+ builder. add_file_edits ( ctx. vfs_file_id ( ) , edit) ;
6571 } ,
6672 )
6773}
@@ -298,6 +304,44 @@ fn main() {
298304 ) ;
299305 }
300306
307+ #[ test]
308+ fn move_multiline_guard_to_arm_body_works ( ) {
309+ check_assist (
310+ move_guard_to_arm_body,
311+ r#"
312+ fn main() {
313+ match 92 {
314+ x $0if true
315+ && true
316+ && true =>
317+ {
318+ {
319+ false
320+ }
321+ },
322+ _ => true
323+ }
324+ }
325+ "# ,
326+ r#"
327+ fn main() {
328+ match 92 {
329+ x => if true
330+ && true
331+ && true {
332+ {
333+ {
334+ false
335+ }
336+ }
337+ },
338+ _ => true
339+ }
340+ }
341+ "# ,
342+ ) ;
343+ }
344+
301345 #[ test]
302346 fn move_guard_to_arm_body_works_complex_match ( ) {
303347 check_assist (
0 commit comments