1- use std:: fmt:: Write ;
2-
3- use format_buf:: format;
41use hir:: Adt ;
5- use join_to_string:: join;
62use ra_syntax:: {
73 ast:: {
84 self , AstNode , NameOwner , StructKind , TypeAscriptionOwner , TypeParamsOwner , VisibilityOwner ,
95 } ,
106 TextUnit , T ,
117} ;
8+ use stdx:: { format_to, SepBy } ;
129
1310use crate :: { Assist , AssistCtx , AssistId } ;
1411
@@ -53,24 +50,22 @@ pub(crate) fn add_new(ctx: AssistCtx) -> Option<Assist> {
5350 buf. push ( '\n' ) ;
5451 }
5552
56- let vis = strukt. visibility ( ) . map ( |v| format ! ( "{} " , v. syntax ( ) ) ) ;
53+ let vis = strukt. visibility ( ) . map ( |v| format ! ( "{} " , v) ) ;
5754 let vis = vis. as_deref ( ) . unwrap_or ( "" ) ;
58- write ! ( & mut buf, " {}fn new(" , vis) . unwrap ( ) ;
59-
60- join ( field_list. fields ( ) . filter_map ( |f| {
61- Some ( format ! ( "{}: {}" , f. name( ) ?. syntax( ) . text( ) , f. ascribed_type( ) ?. syntax( ) . text( ) ) )
62- } ) )
63- . separator ( ", " )
64- . to_buf ( & mut buf) ;
6555
66- buf. push_str ( ") -> Self { Self {" ) ;
67-
68- join ( field_list. fields ( ) . filter_map ( |f| Some ( f. name ( ) ?. syntax ( ) . text ( ) ) ) )
69- . separator ( ", " )
70- . surround_with ( " " , " " )
71- . to_buf ( & mut buf) ;
56+ let params = field_list
57+ . fields ( )
58+ . filter_map ( |f| {
59+ Some ( format ! (
60+ "{}: {}" ,
61+ f. name( ) ?. syntax( ) . text( ) ,
62+ f. ascribed_type( ) ?. syntax( ) . text( )
63+ ) )
64+ } )
65+ . sep_by ( ", " ) ;
66+ let fields = field_list. fields ( ) . filter_map ( |f| f. name ( ) ) . sep_by ( ", " ) ;
7267
73- buf . push_str ( "} }" ) ;
68+ format_to ! ( buf , " {}fn new({}) -> Self {{ Self {{ {} }} }}" , vis , params , fields ) ;
7469
7570 let ( start_offset, end_offset) = impl_def
7671 . and_then ( |impl_def| {
@@ -103,7 +98,7 @@ fn generate_impl_text(strukt: &ast::StructDef, code: &str) -> String {
10398 let mut buf = String :: with_capacity ( code. len ( ) ) ;
10499 buf. push_str ( "\n \n impl" ) ;
105100 if let Some ( type_params) = & type_params {
106- format ! ( buf, "{}" , type_params. syntax( ) ) ;
101+ format_to ! ( buf, "{}" , type_params. syntax( ) ) ;
107102 }
108103 buf. push_str ( " " ) ;
109104 buf. push_str ( strukt. name ( ) . unwrap ( ) . text ( ) . as_str ( ) ) ;
@@ -114,10 +109,10 @@ fn generate_impl_text(strukt: &ast::StructDef, code: &str) -> String {
114109 . map ( |it| it. text ( ) . clone ( ) ) ;
115110 let type_params =
116111 type_params. type_params ( ) . filter_map ( |it| it. name ( ) ) . map ( |it| it. text ( ) . clone ( ) ) ;
117- join ( lifetime_params. chain ( type_params) ) . surround_with ( "<" , ">" ) . to_buf ( & mut buf ) ;
112+ format_to ! ( buf , "<{}>" , lifetime_params. chain( type_params) . sep_by ( " , ") )
118113 }
119114
120- format ! ( & mut buf, " {{\n {}\n }}\n " , code) ;
115+ format_to ! ( buf, " {{\n {}\n }}\n " , code) ;
121116
122117 buf
123118}
0 commit comments