Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/postfix.rs')
-rw-r--r--crates/ide-completion/src/completions/postfix.rs63
1 files changed, 51 insertions, 12 deletions
diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs
index af83d4104f..72c0885e92 100644
--- a/crates/ide-completion/src/completions/postfix.rs
+++ b/crates/ide-completion/src/completions/postfix.rs
@@ -2,6 +2,7 @@
mod format_like;
+use hir::ItemInNs;
use ide_db::{
documentation::{Documentation, HasDocs},
imports::insert_use::ImportScope,
@@ -17,7 +18,7 @@ use text_edit::TextEdit;
use crate::{
completions::postfix::format_like::add_format_like_completions,
- context::{CompletionContext, DotAccess, DotAccessKind},
+ context::{BreakableKind, CompletionContext, DotAccess, DotAccessKind},
item::{Builder, CompletionRelevancePostfixMatch},
CompletionItem, CompletionItemKind, CompletionRelevance, Completions, SnippetScope,
};
@@ -44,6 +45,7 @@ pub(crate) fn complete_postfix(
),
_ => return,
};
+ let expr_ctx = &dot_access.ctx;
let receiver_text = get_receiver_text(dot_receiver, receiver_is_ambiguous_float_literal);
@@ -59,16 +61,22 @@ pub(crate) fn complete_postfix(
if let Some(drop_trait) = ctx.famous_defs().core_ops_Drop() {
if receiver_ty.impls_trait(ctx.db, drop_trait, &[]) {
- if let &[hir::AssocItem::Function(drop_fn)] = &*drop_trait.items(ctx.db) {
- cov_mark::hit!(postfix_drop_completion);
- // FIXME: check that `drop` is in scope, use fully qualified path if it isn't/if shadowed
- let mut item = postfix_snippet(
- "drop",
- "fn drop(&mut self)",
- &format!("drop($0{receiver_text})"),
- );
- item.set_documentation(drop_fn.docs(ctx.db));
- item.add_to(acc, ctx.db);
+ if let Some(drop_fn) = ctx.famous_defs().core_mem_drop() {
+ if let Some(path) = ctx.module.find_use_path(
+ ctx.db,
+ ItemInNs::Values(drop_fn.into()),
+ ctx.config.prefer_no_std,
+ ctx.config.prefer_prelude,
+ ) {
+ cov_mark::hit!(postfix_drop_completion);
+ let mut item = postfix_snippet(
+ "drop",
+ "fn drop(&mut self)",
+ &format!("{path}($0{receiver_text})", path = path.display(ctx.db)),
+ );
+ item.set_documentation(drop_fn.docs(ctx.db));
+ item.add_to(acc, ctx.db);
+ }
}
}
}
@@ -140,6 +148,7 @@ pub(crate) fn complete_postfix(
postfix_snippet("ref", "&expr", &format!("&{receiver_text}")).add_to(acc, ctx.db);
postfix_snippet("refm", "&mut expr", &format!("&mut {receiver_text}")).add_to(acc, ctx.db);
+ postfix_snippet("deref", "*expr", &format!("*{receiver_text}")).add_to(acc, ctx.db);
let mut unsafe_should_be_wrapped = true;
if dot_receiver.syntax().kind() == BLOCK_EXPR {
@@ -224,6 +233,28 @@ pub(crate) fn complete_postfix(
add_format_like_completions(acc, ctx, &dot_receiver, cap, &literal_text);
}
}
+
+ postfix_snippet(
+ "return",
+ "return expr",
+ &format!(
+ "return {receiver_text}{semi}",
+ semi = if expr_ctx.in_block_expr { ";" } else { "" }
+ ),
+ )
+ .add_to(acc, ctx.db);
+
+ if let BreakableKind::Block | BreakableKind::Loop = expr_ctx.in_breakable {
+ postfix_snippet(
+ "break",
+ "break expr",
+ &format!(
+ "break {receiver_text}{semi}",
+ semi = if expr_ctx.in_block_expr { ";" } else { "" }
+ ),
+ )
+ .add_to(acc, ctx.db);
+ }
}
fn get_receiver_text(receiver: &ast::Expr, receiver_is_ambiguous_float_literal: bool) -> String {
@@ -295,7 +326,7 @@ fn build_postfix_snippet_builder<'ctx>(
delete_range: TextRange,
) -> impl Fn(&str, &str, &str) -> Builder + 'ctx {
move |label, detail, snippet| {
- let edit = TextEdit::replace(delete_range, snippet.to_string());
+ let edit = TextEdit::replace(delete_range, snippet.to_owned());
let mut item =
CompletionItem::new(CompletionItemKind::Snippet, ctx.source_range(), label);
item.detail(detail).snippet_edit(cap, edit);
@@ -368,6 +399,7 @@ fn main() {
sn call function(expr)
sn dbg dbg!(expr)
sn dbgr dbg!(&expr)
+ sn deref *expr
sn if if expr {}
sn let let
sn letm let mut
@@ -375,6 +407,7 @@ fn main() {
sn not !expr
sn ref &expr
sn refm &mut expr
+ sn return return expr
sn unsafe unsafe {}
sn while while expr {}
"#]],
@@ -399,11 +432,13 @@ fn main() {
sn call function(expr)
sn dbg dbg!(expr)
sn dbgr dbg!(&expr)
+ sn deref *expr
sn if if expr {}
sn match match expr {}
sn not !expr
sn ref &expr
sn refm &mut expr
+ sn return return expr
sn unsafe unsafe {}
sn while while expr {}
"#]],
@@ -424,11 +459,13 @@ fn main() {
sn call function(expr)
sn dbg dbg!(expr)
sn dbgr dbg!(&expr)
+ sn deref *expr
sn let let
sn letm let mut
sn match match expr {}
sn ref &expr
sn refm &mut expr
+ sn return return expr
sn unsafe unsafe {}
"#]],
)
@@ -448,6 +485,7 @@ fn main() {
sn call function(expr)
sn dbg dbg!(expr)
sn dbgr dbg!(&expr)
+ sn deref *expr
sn if if expr {}
sn let let
sn letm let mut
@@ -455,6 +493,7 @@ fn main() {
sn not !expr
sn ref &expr
sn refm &mut expr
+ sn return return expr
sn unsafe unsafe {}
sn while while expr {}
"#]],