11use syntax:: {
22 Direction , SyntaxKind , T ,
33 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 } ,
66} ;
77
88use crate :: { AssistContext , AssistId , Assists } ;
@@ -33,7 +33,7 @@ use crate::{AssistContext, AssistId, Assists};
3333// ```
3434pub ( crate ) fn unmerge_match_arm ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
3535 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 ( ) ?) ?;
3737 if or_pat. leading_pipe ( ) . is_some_and ( |it| it == pipe_token) {
3838 return None ;
3939 }
@@ -44,13 +44,14 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
4444 // without `OrPat`.
4545
4646 let new_parent = match_arm. syntax ( ) . parent ( ) ?;
47- let old_parent_range = new_parent. text_range ( ) ;
4847
4948 acc. add (
5049 AssistId :: refactor_rewrite ( "unmerge_match_arm" ) ,
5150 "Unmerge match arm" ,
5251 pipe_token. text_range ( ) ,
5352 |edit| {
53+ let make = SyntaxFactory :: with_mappings ( ) ;
54+ let mut editor = edit. make_editor ( & new_parent) ;
5455 let pats_after = pipe_token
5556 . siblings_with_tokens ( Direction :: Next )
5657 . 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
5960 let new_pat = if pats_after. len ( ) == 1 {
6061 pats_after[ 0 ] . clone ( )
6162 } 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 ( )
6364 } ;
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) ;
6766 let mut pipe_index = pipe_token. index ( ) ;
6867 if pipe_token
6968 . prev_sibling_or_token ( )
7069 . is_some_and ( |it| it. kind ( ) == SyntaxKind :: WHITESPACE )
7170 {
7271 pipe_index -= 1 ;
7372 }
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+ }
7880
7981 let mut insert_after_old_arm = Vec :: new ( ) ;
8082
@@ -95,24 +97,20 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
9597 == Some ( T ! [ , ] ) ;
9698 let has_arms_after = neighbor ( & match_arm, Direction :: Next ) . is_some ( ) ;
9799 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 ( ) ) ;
99101 }
100102
101103 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 ( ) ) ;
103105
104106 insert_after_old_arm. push ( new_match_arm. syntax ( ) . clone ( ) . into ( ) ) ;
105107
106- ted:: insert_all_raw ( Position :: after ( match_arm. syntax ( ) ) , insert_after_old_arm) ;
107-
108108 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 ( ) ) ;
113110 }
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) ;
116114 } ,
117115 )
118116}
0 commit comments