22
33mod format_like;
44
5+ use hir:: ItemInNs ;
56use ide_db:: {
67 documentation:: { Documentation , HasDocs } ,
78 imports:: insert_use:: ImportScope ,
@@ -17,7 +18,7 @@ use text_edit::TextEdit;
1718
1819use crate :: {
1920 completions:: postfix:: format_like:: add_format_like_completions,
20- context:: { CompletionContext , DotAccess , DotAccessKind } ,
21+ context:: { BreakableKind , CompletionContext , DotAccess , DotAccessKind } ,
2122 item:: { Builder , CompletionRelevancePostfixMatch } ,
2223 CompletionItem , CompletionItemKind , CompletionRelevance , Completions , SnippetScope ,
2324} ;
@@ -44,6 +45,7 @@ pub(crate) fn complete_postfix(
4445 ) ,
4546 _ => return ,
4647 } ;
48+ let expr_ctx = & dot_access. ctx ;
4749
4850 let receiver_text = get_receiver_text ( dot_receiver, receiver_is_ambiguous_float_literal) ;
4951
@@ -59,16 +61,22 @@ pub(crate) fn complete_postfix(
5961
6062 if let Some ( drop_trait) = ctx. famous_defs ( ) . core_ops_Drop ( ) {
6163 if receiver_ty. impls_trait ( ctx. db , drop_trait, & [ ] ) {
62- if let & [ hir:: AssocItem :: Function ( drop_fn) ] = & * drop_trait. items ( ctx. db ) {
63- cov_mark:: hit!( postfix_drop_completion) ;
64- // FIXME: check that `drop` is in scope, use fully qualified path if it isn't/if shadowed
65- let mut item = postfix_snippet (
66- "drop" ,
67- "fn drop(&mut self)" ,
68- & format ! ( "drop($0{receiver_text})" ) ,
69- ) ;
70- item. set_documentation ( drop_fn. docs ( ctx. db ) ) ;
71- item. add_to ( acc, ctx. db ) ;
64+ if let Some ( drop_fn) = ctx. famous_defs ( ) . core_mem_drop ( ) {
65+ if let Some ( path) = ctx. module . find_use_path (
66+ ctx. db ,
67+ ItemInNs :: Values ( drop_fn. into ( ) ) ,
68+ ctx. config . prefer_no_std ,
69+ ctx. config . prefer_prelude ,
70+ ) {
71+ cov_mark:: hit!( postfix_drop_completion) ;
72+ let mut item = postfix_snippet (
73+ "drop" ,
74+ "fn drop(&mut self)" ,
75+ & format ! ( "{path}($0{receiver_text})" , path = path. display( ctx. db) ) ,
76+ ) ;
77+ item. set_documentation ( drop_fn. docs ( ctx. db ) ) ;
78+ item. add_to ( acc, ctx. db ) ;
79+ }
7280 }
7381 }
7482 }
@@ -140,6 +148,7 @@ pub(crate) fn complete_postfix(
140148
141149 postfix_snippet ( "ref" , "&expr" , & format ! ( "&{receiver_text}" ) ) . add_to ( acc, ctx. db ) ;
142150 postfix_snippet ( "refm" , "&mut expr" , & format ! ( "&mut {receiver_text}" ) ) . add_to ( acc, ctx. db ) ;
151+ postfix_snippet ( "deref" , "*expr" , & format ! ( "*{receiver_text}" ) ) . add_to ( acc, ctx. db ) ;
143152
144153 let mut unsafe_should_be_wrapped = true ;
145154 if dot_receiver. syntax ( ) . kind ( ) == BLOCK_EXPR {
@@ -224,6 +233,28 @@ pub(crate) fn complete_postfix(
224233 add_format_like_completions ( acc, ctx, & dot_receiver, cap, & literal_text) ;
225234 }
226235 }
236+
237+ postfix_snippet (
238+ "return" ,
239+ "return expr" ,
240+ & format ! (
241+ "return {receiver_text}{semi}" ,
242+ semi = if expr_ctx. in_block_expr { ";" } else { "" }
243+ ) ,
244+ )
245+ . add_to ( acc, ctx. db ) ;
246+
247+ if let BreakableKind :: Block | BreakableKind :: Loop = expr_ctx. in_breakable {
248+ postfix_snippet (
249+ "break" ,
250+ "break expr" ,
251+ & format ! (
252+ "break {receiver_text}{semi}" ,
253+ semi = if expr_ctx. in_block_expr { ";" } else { "" }
254+ ) ,
255+ )
256+ . add_to ( acc, ctx. db ) ;
257+ }
227258}
228259
229260fn get_receiver_text ( receiver : & ast:: Expr , receiver_is_ambiguous_float_literal : bool ) -> String {
@@ -368,13 +399,15 @@ fn main() {
368399 sn call function(expr)
369400 sn dbg dbg!(expr)
370401 sn dbgr dbg!(&expr)
402+ sn deref *expr
371403 sn if if expr {}
372404 sn let let
373405 sn letm let mut
374406 sn match match expr {}
375407 sn not !expr
376408 sn ref &expr
377409 sn refm &mut expr
410+ sn return return expr
378411 sn unsafe unsafe {}
379412 sn while while expr {}
380413 "# ] ] ,
@@ -399,11 +432,13 @@ fn main() {
399432 sn call function(expr)
400433 sn dbg dbg!(expr)
401434 sn dbgr dbg!(&expr)
435+ sn deref *expr
402436 sn if if expr {}
403437 sn match match expr {}
404438 sn not !expr
405439 sn ref &expr
406440 sn refm &mut expr
441+ sn return return expr
407442 sn unsafe unsafe {}
408443 sn while while expr {}
409444 "# ] ] ,
@@ -424,11 +459,13 @@ fn main() {
424459 sn call function(expr)
425460 sn dbg dbg!(expr)
426461 sn dbgr dbg!(&expr)
462+ sn deref *expr
427463 sn let let
428464 sn letm let mut
429465 sn match match expr {}
430466 sn ref &expr
431467 sn refm &mut expr
468+ sn return return expr
432469 sn unsafe unsafe {}
433470 "# ] ] ,
434471 )
@@ -448,13 +485,15 @@ fn main() {
448485 sn call function(expr)
449486 sn dbg dbg!(expr)
450487 sn dbgr dbg!(&expr)
488+ sn deref *expr
451489 sn if if expr {}
452490 sn let let
453491 sn letm let mut
454492 sn match match expr {}
455493 sn not !expr
456494 sn ref &expr
457495 sn refm &mut expr
496+ sn return return expr
458497 sn unsafe unsafe {}
459498 sn while while expr {}
460499 "# ] ] ,
0 commit comments