@@ -55,7 +55,10 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
55
55
None => return ,
56
56
} ;
57
57
58
- let postfix_snippet = build_postfix_snippet_builder ( ctx, cap, & dot_receiver) ;
58
+ let postfix_snippet = match build_postfix_snippet_builder ( ctx, cap, & dot_receiver) {
59
+ Some ( it) => it,
60
+ None => return ,
61
+ } ;
59
62
60
63
if !ctx. config . snippets . is_empty ( ) {
61
64
add_custom_postfix_completions ( acc, ctx, & postfix_snippet, & receiver_text) ;
@@ -123,7 +126,10 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
123
126
// so it's better to consider references now to avoid breaking the compilation
124
127
let dot_receiver = include_references ( dot_receiver) ;
125
128
let receiver_text = get_receiver_text ( & dot_receiver, receiver_is_ambiguous_float_literal) ;
126
- let postfix_snippet = build_postfix_snippet_builder ( ctx, cap, & dot_receiver) ;
129
+ let postfix_snippet = match build_postfix_snippet_builder ( ctx, cap, & dot_receiver) {
130
+ Some ( it) => it,
131
+ None => return ,
132
+ } ;
127
133
128
134
match try_enum {
129
135
Some ( try_enum) => match try_enum {
@@ -200,27 +206,36 @@ fn include_references(initial_element: &ast::Expr) -> ast::Expr {
200
206
resulting_element
201
207
}
202
208
203
- fn build_postfix_snippet_builder < ' a > (
204
- ctx : & ' a CompletionContext ,
209
+ fn build_postfix_snippet_builder < ' ctx > (
210
+ ctx : & ' ctx CompletionContext ,
205
211
cap : SnippetCap ,
206
- receiver : & ' a ast:: Expr ,
207
- ) -> impl Fn ( & str , & str , & str ) -> Builder + ' a {
212
+ receiver : & ' ctx ast:: Expr ,
213
+ ) -> Option < impl Fn ( & str , & str , & str ) -> Builder + ' ctx > {
208
214
let receiver_syntax = receiver. syntax ( ) ;
209
- let receiver_range = ctx. sema . original_range ( receiver_syntax) . range ;
215
+ let receiver_range = ctx. sema . original_range_opt ( receiver_syntax) ? . range ;
210
216
let delete_range = TextRange :: new ( receiver_range. start ( ) , ctx. source_range ( ) . end ( ) ) ;
211
217
212
- move |label, detail, snippet| {
213
- let edit = TextEdit :: replace ( delete_range, snippet. to_string ( ) ) ;
214
- let mut item = CompletionItem :: new ( CompletionKind :: Postfix , ctx. source_range ( ) , label) ;
215
- item. detail ( detail) . kind ( CompletionItemKind :: Snippet ) . snippet_edit ( cap, edit) ;
216
- if ctx. original_token . text ( ) == label {
217
- let relevance =
218
- CompletionRelevance { exact_postfix_snippet_match : true , ..Default :: default ( ) } ;
219
- item. set_relevance ( relevance) ;
220
- }
218
+ // Wrapping impl Fn in an option ruins lifetime inference for the parameters in a way that
219
+ // can't be annotated for the closure, hence fix it by constructing it without the Option first
220
+ fn build < ' ctx > (
221
+ ctx : & ' ctx CompletionContext ,
222
+ cap : SnippetCap ,
223
+ delete_range : TextRange ,
224
+ ) -> impl Fn ( & str , & str , & str ) -> Builder + ' ctx {
225
+ move |label, detail, snippet| {
226
+ let edit = TextEdit :: replace ( delete_range, snippet. to_string ( ) ) ;
227
+ let mut item = CompletionItem :: new ( CompletionKind :: Postfix , ctx. source_range ( ) , label) ;
228
+ item. detail ( detail) . kind ( CompletionItemKind :: Snippet ) . snippet_edit ( cap, edit) ;
229
+ if ctx. original_token . text ( ) == label {
230
+ let relevance =
231
+ CompletionRelevance { exact_postfix_snippet_match : true , ..Default :: default ( ) } ;
232
+ item. set_relevance ( relevance) ;
233
+ }
221
234
222
- item
235
+ item
236
+ }
223
237
}
238
+ Some ( build ( ctx, cap, delete_range) )
224
239
}
225
240
226
241
fn add_custom_postfix_completions (
0 commit comments