11use either:: Either ;
22use ide_db:: defs:: { Definition , NameRefClass } ;
33use syntax:: {
4- SyntaxKind , SyntaxNode ,
4+ SyntaxKind , SyntaxNode , T ,
55 ast:: { self , AstNode , HasAttrs , HasGenericParams , HasVisibility } ,
66 match_ast,
7- syntax_editor:: { Position , SyntaxEditor } ,
7+ syntax_editor:: { Element , Position , SyntaxEditor } ,
88} ;
99
1010use crate :: { AssistContext , AssistId , Assists , assist_context:: SourceChangeBuilder } ;
@@ -72,7 +72,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
7272 Either :: Right ( v) => Either :: Right ( ctx. sema . to_def ( v) ?) ,
7373 } ;
7474 let target = strukt_or_variant. as_ref ( ) . either ( |s| s. syntax ( ) , |v| v. syntax ( ) ) . text_range ( ) ;
75-
75+ let syntax = strukt_or_variant . as_ref ( ) . either ( |s| s . syntax ( ) , |v| v . syntax ( ) ) ;
7676 acc. add (
7777 AssistId :: refactor_rewrite ( "convert_tuple_struct_to_named_struct" ) ,
7878 "Convert to named struct" ,
@@ -81,58 +81,53 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
8181 let names = generate_names ( tuple_fields. fields ( ) ) ;
8282 edit_field_references ( ctx, edit, tuple_fields. fields ( ) , & names) ;
8383 edit_struct_references ( ctx, edit, strukt_def, & names) ;
84- edit_struct_def ( ctx, edit, & strukt_or_variant, tuple_fields, names) ;
84+ let mut editor = edit. make_editor ( syntax) ;
85+ edit_struct_def ( & mut editor, & strukt_or_variant, tuple_fields, names) ;
86+ edit. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
8587 } ,
8688 )
8789}
8890
8991fn edit_struct_def (
90- ctx : & AssistContext < ' _ > ,
91- edit : & mut SourceChangeBuilder ,
92+ editor : & mut SyntaxEditor ,
9293 strukt : & Either < ast:: Struct , ast:: Variant > ,
9394 tuple_fields : ast:: TupleFieldList ,
9495 names : Vec < ast:: Name > ,
9596) {
9697 let record_fields = tuple_fields. fields ( ) . zip ( names) . filter_map ( |( f, name) | {
9798 let field = ast:: make:: record_field ( f. visibility ( ) , name, f. ty ( ) ?) ;
98- let mut editor = SyntaxEditor :: new ( field. syntax ( ) . clone ( ) ) ;
99- editor . insert_all (
99+ let mut field_editor = SyntaxEditor :: new ( field. syntax ( ) . clone ( ) ) ;
100+ field_editor . insert_all (
100101 Position :: first_child_of ( field. syntax ( ) ) ,
101102 f. attrs ( ) . map ( |attr| attr. syntax ( ) . clone_subtree ( ) . clone_for_update ( ) . into ( ) ) . collect ( ) ,
102103 ) ;
103- ast:: RecordField :: cast ( editor . finish ( ) . new_root ( ) . clone ( ) )
104+ ast:: RecordField :: cast ( field_editor . finish ( ) . new_root ( ) . clone ( ) )
104105 } ) ;
105- let record_fields = ast:: make:: record_field_list ( record_fields) ;
106- let tuple_fields_text_range = tuple_fields. syntax ( ) . text_range ( ) ;
107-
108- edit. edit_file ( ctx. vfs_file_id ( ) ) ;
106+ let record_fields = ast:: make:: record_field_list ( record_fields) . clone_for_update ( ) ;
107+ let tuple_fields_before = Position :: before ( tuple_fields. syntax ( ) ) ;
109108
110109 if let Either :: Left ( strukt) = strukt {
111110 if let Some ( w) = strukt. where_clause ( ) {
112- edit. delete ( w. syntax ( ) . text_range ( ) ) ;
113- edit. insert (
114- tuple_fields_text_range. start ( ) ,
115- ast:: make:: tokens:: single_newline ( ) . text ( ) ,
116- ) ;
117- edit. insert ( tuple_fields_text_range. start ( ) , w. syntax ( ) . text ( ) ) ;
111+ editor. delete ( w. syntax ( ) ) ;
112+ let mut insert_element = Vec :: new ( ) ;
113+ insert_element. push ( ast:: make:: tokens:: single_newline ( ) . syntax_element ( ) ) ;
114+ insert_element. push ( w. syntax ( ) . clone_for_update ( ) . syntax_element ( ) ) ;
118115 if w. syntax ( ) . last_token ( ) . is_none_or ( |t| t. kind ( ) != SyntaxKind :: COMMA ) {
119- edit . insert ( tuple_fields_text_range . start ( ) , "," ) ;
116+ insert_element . push ( ast :: make :: token ( T ! [ , ] ) . into ( ) ) ;
120117 }
121- edit. insert (
122- tuple_fields_text_range. start ( ) ,
123- ast:: make:: tokens:: single_newline ( ) . text ( ) ,
124- ) ;
118+ insert_element. push ( ast:: make:: tokens:: single_newline ( ) . syntax_element ( ) ) ;
119+ editor. insert_all ( tuple_fields_before, insert_element) ;
125120 } else {
126- edit . insert ( tuple_fields_text_range . start ( ) , ast:: make:: tokens:: single_space ( ) . text ( ) ) ;
121+ editor . insert ( tuple_fields_before , ast:: make:: tokens:: single_space ( ) ) ;
127122 }
128123 if let Some ( t) = strukt. semicolon_token ( ) {
129- edit . delete ( t. text_range ( ) ) ;
124+ editor . delete ( t) ;
130125 }
131126 } else {
132- edit . insert ( tuple_fields_text_range . start ( ) , ast:: make:: tokens:: single_space ( ) . text ( ) ) ;
127+ editor . insert ( tuple_fields_before , ast:: make:: tokens:: single_space ( ) ) ;
133128 }
134129
135- edit . replace ( tuple_fields_text_range , record_fields. to_string ( ) ) ;
130+ editor . replace ( tuple_fields . syntax ( ) , record_fields. syntax ( ) ) ;
136131}
137132
138133fn edit_struct_references (
@@ -1015,8 +1010,7 @@ where
10151010pub struct $0Foo(#[my_custom_attr] u32);
10161011"# ,
10171012 r#"
1018- pub struct Foo { #[my_custom_attr]
1019- field1: u32 }
1013+ pub struct Foo { #[my_custom_attr]field1: u32 }
10201014"# ,
10211015 ) ;
10221016 }
0 commit comments