@@ -53,24 +53,21 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
53
53
Some ( it) => it,
54
54
None => return ,
55
55
} ;
56
+
57
+ let postfix_snippet = build_postfix_snippet_builder ( ctx, cap, & dot_receiver) ;
58
+
56
59
let try_enum = TryEnum :: from_ty ( & ctx. sema , & receiver_ty. strip_references ( ) ) ;
57
60
if let Some ( try_enum) = & try_enum {
58
61
match try_enum {
59
62
TryEnum :: Result => {
60
63
postfix_snippet (
61
- ctx,
62
- cap,
63
- dot_receiver,
64
64
"ifl" ,
65
65
"if let Ok {}" ,
66
66
& format ! ( "if let Ok($1) = {} {{\n $0\n }}" , receiver_text) ,
67
67
)
68
68
. add_to ( acc) ;
69
69
70
70
postfix_snippet (
71
- ctx,
72
- cap,
73
- dot_receiver,
74
71
"while" ,
75
72
"while let Ok {}" ,
76
73
& format ! ( "while let Ok($1) = {} {{\n $0\n }}" , receiver_text) ,
@@ -79,19 +76,13 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
79
76
}
80
77
TryEnum :: Option => {
81
78
postfix_snippet (
82
- ctx,
83
- cap,
84
- dot_receiver,
85
79
"ifl" ,
86
80
"if let Some {}" ,
87
81
& format ! ( "if let Some($1) = {} {{\n $0\n }}" , receiver_text) ,
88
82
)
89
83
. add_to ( acc) ;
90
84
91
85
postfix_snippet (
92
- ctx,
93
- cap,
94
- dot_receiver,
95
86
"while" ,
96
87
"while let Some {}" ,
97
88
& format ! ( "while let Some($1) = {} {{\n $0\n }}" , receiver_text) ,
@@ -100,32 +91,18 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
100
91
}
101
92
}
102
93
} else if receiver_ty. is_bool ( ) || receiver_ty. is_unknown ( ) {
94
+ postfix_snippet ( "if" , "if expr {}" , & format ! ( "if {} {{\n $0\n }}" , receiver_text) )
95
+ . add_to ( acc) ;
103
96
postfix_snippet (
104
- ctx,
105
- cap,
106
- dot_receiver,
107
- "if" ,
108
- "if expr {}" ,
109
- & format ! ( "if {} {{\n $0\n }}" , receiver_text) ,
110
- )
111
- . add_to ( acc) ;
112
- postfix_snippet (
113
- ctx,
114
- cap,
115
- dot_receiver,
116
97
"while" ,
117
98
"while expr {}" ,
118
99
& format ! ( "while {} {{\n $0\n }}" , receiver_text) ,
119
100
)
120
101
. add_to ( acc) ;
121
- postfix_snippet ( ctx, cap, dot_receiver, "not" , "!expr" , & format ! ( "!{}" , receiver_text) )
122
- . add_to ( acc) ;
102
+ postfix_snippet ( "not" , "!expr" , & format ! ( "!{}" , receiver_text) ) . add_to ( acc) ;
123
103
} else if let Some ( trait_) = FamousDefs ( & ctx. sema , ctx. krate ) . core_iter_IntoIterator ( ) {
124
104
if receiver_ty. impls_trait ( ctx. db , trait_, & [ ] ) {
125
105
postfix_snippet (
126
- ctx,
127
- cap,
128
- dot_receiver,
129
106
"for" ,
130
107
"for ele in expr {}" ,
131
108
& format ! ( "for ele in {} {{\n $0\n }}" , receiver_text) ,
@@ -134,30 +111,19 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
134
111
}
135
112
}
136
113
137
- postfix_snippet ( ctx, cap, dot_receiver, "ref" , "&expr" , & format ! ( "&{}" , receiver_text) )
138
- . add_to ( acc) ;
139
- postfix_snippet (
140
- ctx,
141
- cap,
142
- dot_receiver,
143
- "refm" ,
144
- "&mut expr" ,
145
- & format ! ( "&mut {}" , receiver_text) ,
146
- )
147
- . add_to ( acc) ;
114
+ postfix_snippet ( "ref" , "&expr" , & format ! ( "&{}" , receiver_text) ) . add_to ( acc) ;
115
+ postfix_snippet ( "refm" , "&mut expr" , & format ! ( "&mut {}" , receiver_text) ) . add_to ( acc) ;
148
116
149
117
// The rest of the postfix completions create an expression that moves an argument,
150
118
// so it's better to consider references now to avoid breaking the compilation
151
119
let dot_receiver = include_references ( dot_receiver) ;
152
120
let receiver_text = get_receiver_text ( & dot_receiver, receiver_is_ambiguous_float_literal) ;
121
+ let postfix_snippet = build_postfix_snippet_builder ( ctx, cap, & dot_receiver) ;
153
122
154
123
match try_enum {
155
124
Some ( try_enum) => match try_enum {
156
125
TryEnum :: Result => {
157
126
postfix_snippet (
158
- ctx,
159
- cap,
160
- & dot_receiver,
161
127
"match" ,
162
128
"match expr {}" ,
163
129
& format ! ( "match {} {{\n Ok(${{1:_}}) => {{$2}},\n Err(${{3:_}}) => {{$0}},\n }}" , receiver_text) ,
@@ -166,9 +132,6 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
166
132
}
167
133
TryEnum :: Option => {
168
134
postfix_snippet (
169
- ctx,
170
- cap,
171
- & dot_receiver,
172
135
"match" ,
173
136
"match expr {}" ,
174
137
& format ! (
@@ -181,9 +144,6 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
181
144
} ,
182
145
None => {
183
146
postfix_snippet (
184
- ctx,
185
- cap,
186
- & dot_receiver,
187
147
"match" ,
188
148
"match expr {}" ,
189
149
& format ! ( "match {} {{\n ${{1:_}} => {{$0}},\n }}" , receiver_text) ,
@@ -192,89 +152,19 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
192
152
}
193
153
}
194
154
195
- postfix_snippet (
196
- ctx,
197
- cap,
198
- & dot_receiver,
199
- "box" ,
200
- "Box::new(expr)" ,
201
- & format ! ( "Box::new({})" , receiver_text) ,
202
- )
203
- . add_to ( acc) ;
204
-
205
- postfix_snippet ( ctx, cap, & dot_receiver, "ok" , "Ok(expr)" , & format ! ( "Ok({})" , receiver_text) )
206
- . add_to ( acc) ;
207
-
208
- postfix_snippet (
209
- ctx,
210
- cap,
211
- & dot_receiver,
212
- "err" ,
213
- "Err(expr)" ,
214
- & format ! ( "Err({})" , receiver_text) ,
215
- )
216
- . add_to ( acc) ;
217
-
218
- postfix_snippet (
219
- ctx,
220
- cap,
221
- & dot_receiver,
222
- "some" ,
223
- "Some(expr)" ,
224
- & format ! ( "Some({})" , receiver_text) ,
225
- )
226
- . add_to ( acc) ;
227
-
228
- postfix_snippet (
229
- ctx,
230
- cap,
231
- & dot_receiver,
232
- "dbg" ,
233
- "dbg!(expr)" ,
234
- & format ! ( "dbg!({})" , receiver_text) ,
235
- )
236
- . add_to ( acc) ;
237
-
238
- postfix_snippet (
239
- ctx,
240
- cap,
241
- & dot_receiver,
242
- "dbgr" ,
243
- "dbg!(&expr)" ,
244
- & format ! ( "dbg!(&{})" , receiver_text) ,
245
- )
246
- . add_to ( acc) ;
247
-
248
- postfix_snippet (
249
- ctx,
250
- cap,
251
- & dot_receiver,
252
- "call" ,
253
- "function(expr)" ,
254
- & format ! ( "${{1}}({})" , receiver_text) ,
255
- )
256
- . add_to ( acc) ;
155
+ postfix_snippet ( "box" , "Box::new(expr)" , & format ! ( "Box::new({})" , receiver_text) ) . add_to ( acc) ;
156
+ postfix_snippet ( "ok" , "Ok(expr)" , & format ! ( "Ok({})" , receiver_text) ) . add_to ( acc) ;
157
+ postfix_snippet ( "err" , "Err(expr)" , & format ! ( "Err({})" , receiver_text) ) . add_to ( acc) ;
158
+ postfix_snippet ( "some" , "Some(expr)" , & format ! ( "Some({})" , receiver_text) ) . add_to ( acc) ;
159
+ postfix_snippet ( "dbg" , "dbg!(expr)" , & format ! ( "dbg!({})" , receiver_text) ) . add_to ( acc) ;
160
+ postfix_snippet ( "dbgr" , "dbg!(&expr)" , & format ! ( "dbg!(&{})" , receiver_text) ) . add_to ( acc) ;
161
+ postfix_snippet ( "call" , "function(expr)" , & format ! ( "${{1}}({})" , receiver_text) ) . add_to ( acc) ;
257
162
258
163
if let Some ( parent) = dot_receiver. syntax ( ) . parent ( ) . and_then ( |p| p. parent ( ) ) {
259
164
if matches ! ( parent. kind( ) , STMT_LIST | EXPR_STMT ) {
260
- postfix_snippet (
261
- ctx,
262
- cap,
263
- & dot_receiver,
264
- "let" ,
265
- "let" ,
266
- & format ! ( "let $0 = {};" , receiver_text) ,
267
- )
268
- . add_to ( acc) ;
269
- postfix_snippet (
270
- ctx,
271
- cap,
272
- & dot_receiver,
273
- "letm" ,
274
- "let mut" ,
275
- & format ! ( "let mut $0 = {};" , receiver_text) ,
276
- )
277
- . add_to ( acc) ;
165
+ postfix_snippet ( "let" , "let" , & format ! ( "let $0 = {};" , receiver_text) ) . add_to ( acc) ;
166
+ postfix_snippet ( "letm" , "let mut" , & format ! ( "let mut $0 = {};" , receiver_text) )
167
+ . add_to ( acc) ;
278
168
}
279
169
}
280
170
@@ -305,29 +195,27 @@ fn include_references(initial_element: &ast::Expr) -> ast::Expr {
305
195
resulting_element
306
196
}
307
197
308
- fn postfix_snippet (
309
- ctx : & CompletionContext ,
198
+ fn build_postfix_snippet_builder < ' a > (
199
+ ctx : & ' a CompletionContext ,
310
200
cap : SnippetCap ,
311
- receiver : & ast:: Expr ,
312
- label : & str ,
313
- detail : & str ,
314
- snippet : & str ,
315
- ) -> Builder {
316
- let edit = {
317
- let receiver_syntax = receiver. syntax ( ) ;
318
- let receiver_range = ctx. sema . original_range ( receiver_syntax) . range ;
319
- let delete_range = TextRange :: new ( receiver_range. start ( ) , ctx. source_range ( ) . end ( ) ) ;
320
- TextEdit :: replace ( delete_range, snippet. to_string ( ) )
321
- } ;
322
- let mut item = CompletionItem :: new ( CompletionKind :: Postfix , ctx. source_range ( ) , label) ;
323
- item. detail ( detail) . kind ( CompletionItemKind :: Snippet ) . snippet_edit ( cap, edit) ;
324
- if ctx. original_token . text ( ) == label {
325
- let relevance =
326
- CompletionRelevance { exact_postfix_snippet_match : true , ..Default :: default ( ) } ;
327
- item. set_relevance ( relevance) ;
328
- }
201
+ receiver : & ' a ast:: Expr ,
202
+ ) -> impl Fn ( & str , & str , & str ) -> Builder + ' a {
203
+ let receiver_syntax = receiver. syntax ( ) ;
204
+ let receiver_range = ctx. sema . original_range ( receiver_syntax) . range ;
205
+ let delete_range = TextRange :: new ( receiver_range. start ( ) , ctx. source_range ( ) . end ( ) ) ;
206
+
207
+ move |label, detail, snippet| {
208
+ let edit = TextEdit :: replace ( delete_range, snippet. to_string ( ) ) ;
209
+ let mut item = CompletionItem :: new ( CompletionKind :: Postfix , ctx. source_range ( ) , label) ;
210
+ item. detail ( detail) . kind ( CompletionItemKind :: Snippet ) . snippet_edit ( cap, edit) ;
211
+ if ctx. original_token . text ( ) == label {
212
+ let relevance =
213
+ CompletionRelevance { exact_postfix_snippet_match : true , ..Default :: default ( ) } ;
214
+ item. set_relevance ( relevance) ;
215
+ }
329
216
330
- item
217
+ item
218
+ }
331
219
}
332
220
333
221
#[ cfg( test) ]
0 commit comments