1
1
use syntax:: {
2
2
Direction , SyntaxKind , T ,
3
3
algo:: neighbor,
4
- ast:: { self , AstNode , edit:: IndentLevel , make } ,
5
- ted :: { self , Position } ,
4
+ ast:: { self , AstNode , edit:: IndentLevel , syntax_factory :: SyntaxFactory } ,
5
+ syntax_editor :: { Element , Position } ,
6
6
} ;
7
7
8
8
use crate :: { AssistContext , AssistId , Assists } ;
@@ -33,7 +33,7 @@ use crate::{AssistContext, AssistId, Assists};
33
33
// ```
34
34
pub ( crate ) fn unmerge_match_arm ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
35
35
let pipe_token = ctx. find_token_syntax_at_offset ( T ! [ |] ) ?;
36
- let or_pat = ast:: OrPat :: cast ( pipe_token. parent ( ) ?) ?. clone_for_update ( ) ;
36
+ let or_pat = ast:: OrPat :: cast ( pipe_token. parent ( ) ?) ?;
37
37
if or_pat. leading_pipe ( ) . is_some_and ( |it| it == pipe_token) {
38
38
return None ;
39
39
}
@@ -44,13 +44,14 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
44
44
// without `OrPat`.
45
45
46
46
let new_parent = match_arm. syntax ( ) . parent ( ) ?;
47
- let old_parent_range = new_parent. text_range ( ) ;
48
47
49
48
acc. add (
50
49
AssistId :: refactor_rewrite ( "unmerge_match_arm" ) ,
51
50
"Unmerge match arm" ,
52
51
pipe_token. text_range ( ) ,
53
52
|edit| {
53
+ let make = SyntaxFactory :: with_mappings ( ) ;
54
+ let mut editor = edit. make_editor ( & new_parent) ;
54
55
let pats_after = pipe_token
55
56
. siblings_with_tokens ( Direction :: Next )
56
57
. filter_map ( |it| ast:: Pat :: cast ( it. into_node ( ) ?) )
@@ -59,22 +60,23 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
59
60
let new_pat = if pats_after. len ( ) == 1 {
60
61
pats_after[ 0 ] . clone ( )
61
62
} else {
62
- make:: or_pat ( pats_after, or_pat. leading_pipe ( ) . is_some ( ) ) . into ( )
63
+ make. or_pat ( pats_after, or_pat. leading_pipe ( ) . is_some ( ) ) . into ( )
63
64
} ;
64
- let new_match_arm =
65
- make:: match_arm ( new_pat, match_arm. guard ( ) , match_arm_body) . clone_for_update ( ) ;
66
-
65
+ let new_match_arm = make. match_arm ( new_pat, match_arm. guard ( ) , match_arm_body) ;
67
66
let mut pipe_index = pipe_token. index ( ) ;
68
67
if pipe_token
69
68
. prev_sibling_or_token ( )
70
69
. is_some_and ( |it| it. kind ( ) == SyntaxKind :: WHITESPACE )
71
70
{
72
71
pipe_index -= 1 ;
73
72
}
74
- or_pat. syntax ( ) . splice_children (
75
- pipe_index..or_pat. syntax ( ) . children_with_tokens ( ) . count ( ) ,
76
- Vec :: new ( ) ,
77
- ) ;
73
+ for child in or_pat
74
+ . syntax ( )
75
+ . children_with_tokens ( )
76
+ . skip_while ( |child| child. index ( ) < pipe_index)
77
+ {
78
+ editor. delete ( child. syntax_element ( ) ) ;
79
+ }
78
80
79
81
let mut insert_after_old_arm = Vec :: new ( ) ;
80
82
@@ -95,24 +97,20 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
95
97
== Some ( T ! [ , ] ) ;
96
98
let has_arms_after = neighbor ( & match_arm, Direction :: Next ) . is_some ( ) ;
97
99
if !has_comma_after && !has_arms_after {
98
- insert_after_old_arm. push ( make:: token ( T ! [ , ] ) . into ( ) ) ;
100
+ insert_after_old_arm. push ( make. token ( T ! [ , ] ) . into ( ) ) ;
99
101
}
100
102
101
103
let indent = IndentLevel :: from_node ( match_arm. syntax ( ) ) ;
102
- insert_after_old_arm. push ( make:: tokens :: whitespace ( & format ! ( "\n {indent}" ) ) . into ( ) ) ;
104
+ insert_after_old_arm. push ( make. whitespace ( & format ! ( "\n {indent}" ) ) . into ( ) ) ;
103
105
104
106
insert_after_old_arm. push ( new_match_arm. syntax ( ) . clone ( ) . into ( ) ) ;
105
107
106
- ted:: insert_all_raw ( Position :: after ( match_arm. syntax ( ) ) , insert_after_old_arm) ;
107
-
108
108
if has_comma_after {
109
- ted:: insert_raw (
110
- Position :: last_child_of ( new_match_arm. syntax ( ) ) ,
111
- make:: token ( T ! [ , ] ) ,
112
- ) ;
109
+ insert_after_old_arm. push ( make. token ( T ! [ , ] ) . into ( ) ) ;
113
110
}
114
-
115
- edit. replace ( old_parent_range, new_parent. to_string ( ) ) ;
111
+ editor. insert_all ( Position :: after ( match_arm. syntax ( ) ) , insert_after_old_arm) ;
112
+ editor. add_mappings ( make. finish_with_mappings ( ) ) ;
113
+ edit. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
116
114
} ,
117
115
)
118
116
}
0 commit comments