1
1
use either:: Either ;
2
2
use ide_db:: defs:: { Definition , NameRefClass } ;
3
3
use syntax:: {
4
- SyntaxKind , SyntaxNode ,
4
+ SyntaxKind , SyntaxNode , T ,
5
5
ast:: { self , AstNode , HasAttrs , HasGenericParams , HasVisibility } ,
6
6
match_ast,
7
- syntax_editor:: { Position , SyntaxEditor } ,
7
+ syntax_editor:: { Element , Position , SyntaxEditor } ,
8
8
} ;
9
9
10
10
use crate :: { AssistContext , AssistId , Assists , assist_context:: SourceChangeBuilder } ;
@@ -72,7 +72,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
72
72
Either :: Right ( v) => Either :: Right ( ctx. sema . to_def ( v) ?) ,
73
73
} ;
74
74
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 ( ) ) ;
76
76
acc. add (
77
77
AssistId :: refactor_rewrite ( "convert_tuple_struct_to_named_struct" ) ,
78
78
"Convert to named struct" ,
@@ -81,58 +81,53 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
81
81
let names = generate_names ( tuple_fields. fields ( ) ) ;
82
82
edit_field_references ( ctx, edit, tuple_fields. fields ( ) , & names) ;
83
83
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) ;
85
87
} ,
86
88
)
87
89
}
88
90
89
91
fn edit_struct_def (
90
- ctx : & AssistContext < ' _ > ,
91
- edit : & mut SourceChangeBuilder ,
92
+ editor : & mut SyntaxEditor ,
92
93
strukt : & Either < ast:: Struct , ast:: Variant > ,
93
94
tuple_fields : ast:: TupleFieldList ,
94
95
names : Vec < ast:: Name > ,
95
96
) {
96
97
let record_fields = tuple_fields. fields ( ) . zip ( names) . filter_map ( |( f, name) | {
97
98
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 (
100
101
Position :: first_child_of ( field. syntax ( ) ) ,
101
102
f. attrs ( ) . map ( |attr| attr. syntax ( ) . clone_subtree ( ) . clone_for_update ( ) . into ( ) ) . collect ( ) ,
102
103
) ;
103
- ast:: RecordField :: cast ( editor . finish ( ) . new_root ( ) . clone ( ) )
104
+ ast:: RecordField :: cast ( field_editor . finish ( ) . new_root ( ) . clone ( ) )
104
105
} ) ;
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 ( ) ) ;
109
108
110
109
if let Either :: Left ( strukt) = strukt {
111
110
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 ( ) ) ;
118
115
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 ( ) ) ;
120
117
}
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) ;
125
120
} 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 ( ) ) ;
127
122
}
128
123
if let Some ( t) = strukt. semicolon_token ( ) {
129
- edit . delete ( t. text_range ( ) ) ;
124
+ editor . delete ( t) ;
130
125
}
131
126
} 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 ( ) ) ;
133
128
}
134
129
135
- edit . replace ( tuple_fields_text_range , record_fields. to_string ( ) ) ;
130
+ editor . replace ( tuple_fields . syntax ( ) , record_fields. syntax ( ) ) ;
136
131
}
137
132
138
133
fn edit_struct_references (
@@ -1015,8 +1010,7 @@ where
1015
1010
pub struct $0Foo(#[my_custom_attr] u32);
1016
1011
"# ,
1017
1012
r#"
1018
- pub struct Foo { #[my_custom_attr]
1019
- field1: u32 }
1013
+ pub struct Foo { #[my_custom_attr]field1: u32 }
1020
1014
"# ,
1021
1015
) ;
1022
1016
}
0 commit comments