@@ -12,6 +12,7 @@ use ide_db::{
12
12
use stdx:: never;
13
13
use syntax:: {
14
14
ast:: { self , make, AstNode , AstToken } ,
15
+ format_smolstr,
15
16
SyntaxKind :: { BLOCK_EXPR , EXPR_STMT , FOR_EXPR , IF_EXPR , LOOP_EXPR , STMT_LIST , WHILE_EXPR } ,
16
17
TextRange , TextSize ,
17
18
} ;
@@ -55,10 +56,11 @@ pub(crate) fn complete_postfix(
55
56
None => return ,
56
57
} ;
57
58
58
- let postfix_snippet = match build_postfix_snippet_builder ( ctx, cap, dot_receiver) {
59
- Some ( it) => it,
60
- None => return ,
61
- } ;
59
+ let postfix_snippet =
60
+ match build_postfix_snippet_builder ( ctx, cap, dot_receiver, & receiver_text) {
61
+ Some ( it) => it,
62
+ None => return ,
63
+ } ;
62
64
63
65
if let Some ( drop_trait) = ctx. famous_defs ( ) . core_ops_Drop ( ) {
64
66
if receiver_ty. impls_trait ( ctx. db , drop_trait, & [ ] ) {
@@ -173,10 +175,11 @@ pub(crate) fn complete_postfix(
173
175
let ( dot_receiver, node_to_replace_with) = include_references ( dot_receiver) ;
174
176
let receiver_text =
175
177
get_receiver_text ( & node_to_replace_with, receiver_is_ambiguous_float_literal) ;
176
- let postfix_snippet = match build_postfix_snippet_builder ( ctx, cap, & dot_receiver) {
177
- Some ( it) => it,
178
- None => return ,
179
- } ;
178
+ let postfix_snippet =
179
+ match build_postfix_snippet_builder ( ctx, cap, & dot_receiver, & receiver_text) {
180
+ Some ( it) => it,
181
+ None => return ,
182
+ } ;
180
183
181
184
if !ctx. config . snippets . is_empty ( ) {
182
185
add_custom_postfix_completions ( acc, ctx, & postfix_snippet, & receiver_text) ;
@@ -317,6 +320,7 @@ fn build_postfix_snippet_builder<'ctx>(
317
320
ctx : & ' ctx CompletionContext < ' _ > ,
318
321
cap : SnippetCap ,
319
322
receiver : & ' ctx ast:: Expr ,
323
+ receiver_text : & ' ctx str ,
320
324
) -> Option < impl Fn ( & str , & str , & str ) -> Builder + ' ctx > {
321
325
let receiver_range = ctx. sema . original_range_opt ( receiver. syntax ( ) ) ?. range ;
322
326
if ctx. source_range ( ) . end ( ) < receiver_range. start ( ) {
@@ -332,13 +336,16 @@ fn build_postfix_snippet_builder<'ctx>(
332
336
fn build < ' ctx > (
333
337
ctx : & ' ctx CompletionContext < ' _ > ,
334
338
cap : SnippetCap ,
339
+ receiver_text : & ' ctx str ,
335
340
delete_range : TextRange ,
336
341
) -> impl Fn ( & str , & str , & str ) -> Builder + ' ctx {
337
342
move |label, detail, snippet| {
338
343
let edit = TextEdit :: replace ( delete_range, snippet. to_owned ( ) ) ;
339
- let mut item =
340
- CompletionItem :: new ( CompletionItemKind :: Snippet , ctx. source_range ( ) , label) ;
344
+ let mut item = CompletionItem :: new ( CompletionItemKind :: Snippet , delete_range, label) ;
341
345
item. detail ( detail) . snippet_edit ( cap, edit) ;
346
+ // Editors may filter completion item with the text within delete_range, so we need to
347
+ // include the receiver text in the lookup for editors to find the completion item.
348
+ item. lookup_by ( format_smolstr ! ( "{}.{}" , receiver_text, label) ) ;
342
349
let postfix_match = if ctx. original_token . text ( ) == label {
343
350
cov_mark:: hit!( postfix_exact_match_is_high_priority) ;
344
351
Some ( CompletionRelevancePostfixMatch :: Exact )
@@ -351,7 +358,7 @@ fn build_postfix_snippet_builder<'ctx>(
351
358
item
352
359
}
353
360
}
354
- Some ( build ( ctx, cap, delete_range) )
361
+ Some ( build ( ctx, cap, receiver_text , delete_range) )
355
362
}
356
363
357
364
fn add_custom_postfix_completions (
0 commit comments