1
- use std:: fmt:: Write ;
2
-
3
- use format_buf:: format;
4
1
use hir:: Adt ;
5
- use join_to_string:: join;
6
2
use ra_syntax:: {
7
3
ast:: {
8
4
self , AstNode , NameOwner , StructKind , TypeAscriptionOwner , TypeParamsOwner , VisibilityOwner ,
9
5
} ,
10
6
TextUnit , T ,
11
7
} ;
8
+ use stdx:: { format_to, SepBy } ;
12
9
13
10
use crate :: { Assist , AssistCtx , AssistId } ;
14
11
@@ -53,24 +50,22 @@ pub(crate) fn add_new(ctx: AssistCtx) -> Option<Assist> {
53
50
buf. push ( '\n' ) ;
54
51
}
55
52
56
- let vis = strukt. visibility ( ) . map ( |v| format ! ( "{} " , v. syntax ( ) ) ) ;
53
+ let vis = strukt. visibility ( ) . map ( |v| format ! ( "{} " , v) ) ;
57
54
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) ;
65
55
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 ( ", " ) ;
72
67
73
- buf . push_str ( "} }" ) ;
68
+ format_to ! ( buf , " {}fn new({}) -> Self {{ Self {{ {} }} }}" , vis , params , fields ) ;
74
69
75
70
let ( start_offset, end_offset) = impl_def
76
71
. and_then ( |impl_def| {
@@ -103,7 +98,7 @@ fn generate_impl_text(strukt: &ast::StructDef, code: &str) -> String {
103
98
let mut buf = String :: with_capacity ( code. len ( ) ) ;
104
99
buf. push_str ( "\n \n impl" ) ;
105
100
if let Some ( type_params) = & type_params {
106
- format ! ( buf, "{}" , type_params. syntax( ) ) ;
101
+ format_to ! ( buf, "{}" , type_params. syntax( ) ) ;
107
102
}
108
103
buf. push_str ( " " ) ;
109
104
buf. push_str ( strukt. name ( ) . unwrap ( ) . text ( ) . as_str ( ) ) ;
@@ -114,10 +109,10 @@ fn generate_impl_text(strukt: &ast::StructDef, code: &str) -> String {
114
109
. map ( |it| it. text ( ) . clone ( ) ) ;
115
110
let type_params =
116
111
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 ( " , ") )
118
113
}
119
114
120
- format ! ( & mut buf, " {{\n {}\n }}\n " , code) ;
115
+ format_to ! ( buf, " {{\n {}\n }}\n " , code) ;
121
116
122
117
buf
123
118
}
0 commit comments