@@ -40,28 +40,34 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_>)
40
40
return None ;
41
41
}
42
42
let space_before_guard = guard. syntax ( ) . prev_sibling_or_token ( ) ;
43
+ let space_after_arrow = match_arm. fat_arrow_token ( ) ?. next_sibling_or_token ( ) ;
43
44
44
- let guard_condition = guard. condition ( ) ?;
45
+ let guard_condition = guard. condition ( ) ?. reset_indent ( ) ;
45
46
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 ( ) ) ;
49
49
50
50
let target = guard. syntax ( ) . text_range ( ) ;
51
51
acc. add (
52
52
AssistId :: refactor_rewrite ( "move_guard_to_arm_body" ) ,
53
53
"Move guard to arm body" ,
54
54
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
+ }
62
67
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) ;
65
71
} ,
66
72
)
67
73
}
@@ -298,6 +304,44 @@ fn main() {
298
304
) ;
299
305
}
300
306
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
+
301
345
#[ test]
302
346
fn move_guard_to_arm_body_works_complex_match ( ) {
303
347
check_assist (
0 commit comments