@@ -101,21 +101,21 @@ pub(crate) fn extract_struct_from_enum_variant(
101
101
} ) ;
102
102
}
103
103
104
- let indent = enum_ast. indent_level ( ) ;
105
104
let generic_params = enum_ast
106
105
. generic_param_list ( )
107
106
. and_then ( |known_generics| extract_generic_params ( & known_generics, & field_list) ) ;
108
107
let generics = generic_params. as_ref ( ) . map ( |generics| generics. clone_for_update ( ) ) ;
109
- let def =
110
- create_struct_def ( variant_name. clone ( ) , & variant, & field_list, generics, & enum_ast) ;
108
+ let def = create_struct_def ( variant_name. clone ( ) , & field_list, generics, & enum_ast) ;
109
+
110
+ let enum_ast = variant. parent_enum ( ) ;
111
+ let indent = enum_ast. indent_level ( ) ;
111
112
def. reindent_to ( indent) ;
112
113
113
- let start_offset = & variant. parent_enum ( ) . syntax ( ) . clone ( ) ;
114
- ted:: insert_all_raw (
115
- ted:: Position :: before ( start_offset) ,
114
+ ted:: insert_all (
115
+ ted:: Position :: before ( enum_ast. syntax ( ) ) ,
116
116
vec ! [
117
117
def. syntax( ) . clone( ) . into( ) ,
118
- make:: tokens:: whitespace( & format!( "\n \n {}" , indent ) ) . into( ) ,
118
+ make:: tokens:: whitespace( & format!( "\n \n {indent}" ) ) . into( ) ,
119
119
] ,
120
120
) ;
121
121
@@ -227,8 +227,7 @@ fn tag_generics_in_variant(ty: &ast::Type, generics: &mut [(ast::GenericParam, b
227
227
}
228
228
229
229
fn create_struct_def (
230
- variant_name : ast:: Name ,
231
- variant : & ast:: Variant ,
230
+ name : ast:: Name ,
232
231
field_list : & Either < ast:: RecordFieldList , ast:: TupleFieldList > ,
233
232
generics : Option < ast:: GenericParamList > ,
234
233
enum_ : & ast:: Enum ,
@@ -269,37 +268,9 @@ fn create_struct_def(
269
268
field_list. into ( )
270
269
}
271
270
} ;
272
-
273
271
field_list. reindent_to ( IndentLevel :: single ( ) ) ;
274
272
275
- let strukt = make:: struct_ ( enum_vis, variant_name, generics, field_list) . clone_for_update ( ) ;
276
-
277
- // FIXME: Consider making this an actual function somewhere (like in `AttrsOwnerEdit`) after some deliberation
278
- let attrs_and_docs = |node : & SyntaxNode | {
279
- let mut select_next_ws = false ;
280
- node. children_with_tokens ( ) . filter ( move |child| {
281
- let accept = match child. kind ( ) {
282
- ATTR | COMMENT => {
283
- select_next_ws = true ;
284
- return true ;
285
- }
286
- WHITESPACE if select_next_ws => true ,
287
- _ => false ,
288
- } ;
289
- select_next_ws = false ;
290
-
291
- accept
292
- } )
293
- } ;
294
-
295
- // copy attributes & comments from variant
296
- let variant_attrs = attrs_and_docs ( variant. syntax ( ) )
297
- . map ( |tok| match tok. kind ( ) {
298
- WHITESPACE => make:: tokens:: single_newline ( ) . into ( ) ,
299
- _ => tok,
300
- } )
301
- . collect ( ) ;
302
- ted:: insert_all ( ted:: Position :: first_child_of ( strukt. syntax ( ) ) , variant_attrs) ;
273
+ let strukt = make:: struct_ ( enum_vis, name, generics, field_list) . clone_for_update ( ) ;
303
274
304
275
// copy attributes from enum
305
276
ted:: insert_all (
@@ -346,13 +317,20 @@ fn update_variant(variant: &ast::Variant, generics: Option<ast::GenericParamList
346
317
} )
347
318
. unwrap_or_else ( || make:: ty ( & name. text ( ) ) ) ;
348
319
320
+ // change from a record to a tuple field list
349
321
let tuple_field = make:: tuple_field ( None , ty) ;
350
- let replacement = make:: variant (
351
- name,
352
- Some ( ast:: FieldList :: TupleFieldList ( make:: tuple_field_list ( iter:: once ( tuple_field) ) ) ) ,
353
- )
354
- . clone_for_update ( ) ;
355
- ted:: replace ( variant. syntax ( ) , replacement. syntax ( ) ) ;
322
+ let field_list = make:: tuple_field_list ( iter:: once ( tuple_field) ) . clone_for_update ( ) ;
323
+ ted:: replace ( variant. field_list ( ) ?. syntax ( ) , field_list. syntax ( ) ) ;
324
+
325
+ // remove any ws after the name
326
+ if let Some ( ws) = name
327
+ . syntax ( )
328
+ . siblings_with_tokens ( syntax:: Direction :: Next )
329
+ . find_map ( |tok| tok. into_token ( ) . filter ( |tok| tok. kind ( ) == WHITESPACE ) )
330
+ {
331
+ ted:: remove ( SyntaxElement :: Token ( ws) ) ;
332
+ }
333
+
356
334
Some ( ( ) )
357
335
}
358
336
@@ -628,15 +606,15 @@ enum A {
628
606
}
629
607
}"# ,
630
608
r#"
631
- /* comment */
632
- // other
633
- /// comment
634
- #[attr]
635
609
struct One{
636
610
a: u32
637
611
}
638
612
639
613
enum A {
614
+ /* comment */
615
+ // other
616
+ /// comment
617
+ #[attr]
640
618
One(One)
641
619
}"# ,
642
620
) ;
@@ -655,13 +633,13 @@ enum A {
655
633
$0One(u32, u32)
656
634
}"# ,
657
635
r#"
658
- /* comment */
659
- // other
660
- /// comment
661
- #[attr]
662
636
struct One(u32, u32);
663
637
664
638
enum A {
639
+ /* comment */
640
+ // other
641
+ /// comment
642
+ #[attr]
665
643
One(One)
666
644
}"# ,
667
645
) ;
0 commit comments