Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/expr.rs')
-rw-r--r--crates/ide-completion/src/completions/expr.rs38
1 files changed, 28 insertions, 10 deletions
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs
index 6152ccb711..83ecb51aaa 100644
--- a/crates/ide-completion/src/completions/expr.rs
+++ b/crates/ide-completion/src/completions/expr.rs
@@ -14,7 +14,9 @@ pub(crate) fn complete_expr_path(
path_ctx: &PathCompletionCtx,
) {
let _p = profile::span("complete_expr_path");
-
+ if !ctx.qualifier_ctx.none() {
+ return;
+ }
let (
qualified,
in_block_expr,
@@ -23,6 +25,9 @@ pub(crate) fn complete_expr_path(
after_if_expr,
wants_mut_token,
in_condition,
+ ty,
+ incomplete_let,
+ impl_,
) = match path_ctx {
&PathCompletionCtx {
kind:
@@ -31,12 +36,16 @@ pub(crate) fn complete_expr_path(
in_loop_body,
after_if_expr,
in_condition,
+ incomplete_let,
ref ref_expr_parent,
ref is_func_update,
+ ref innermost_ret_ty,
+ ref impl_,
+ ..
},
ref qualified,
..
- } if ctx.qualifier_ctx.none() => (
+ } => (
qualified,
in_block_expr,
in_loop_body,
@@ -44,6 +53,9 @@ pub(crate) fn complete_expr_path(
after_if_expr,
ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false),
in_condition,
+ innermost_ret_ty,
+ incomplete_let,
+ impl_,
),
_ => return,
};
@@ -172,8 +184,7 @@ pub(crate) fn complete_expr_path(
if let Some(adt) =
ctx.expected_type.as_ref().and_then(|ty| ty.strip_references().as_adt())
{
- let self_ty =
- (|| ctx.sema.to_def(ctx.impl_def.as_ref()?)?.self_ty(ctx.db).as_adt())();
+ let self_ty = (|| ctx.sema.to_def(impl_.as_ref()?)?.self_ty(ctx.db).as_adt())();
let complete_self = self_ty == Some(adt);
match adt {
@@ -201,9 +212,15 @@ pub(crate) fn complete_expr_path(
}
}
hir::Adt::Enum(e) => {
- super::enum_variants_with_paths(acc, ctx, e, |acc, ctx, variant, path| {
- acc.add_qualified_enum_variant(ctx, variant, path)
- });
+ super::enum_variants_with_paths(
+ acc,
+ ctx,
+ e,
+ impl_,
+ |acc, ctx, variant, path| {
+ acc.add_qualified_enum_variant(ctx, variant, path)
+ },
+ );
}
}
}
@@ -214,7 +231,8 @@ pub(crate) fn complete_expr_path(
});
if !is_func_update {
- let mut add_keyword = |kw, snippet| acc.add_keyword_snippet(ctx, kw, snippet);
+ let mut add_keyword =
+ |kw, snippet| acc.add_keyword_snippet_expr(ctx, kw, snippet, incomplete_let);
if !in_block_expr {
add_keyword("unsafe", "unsafe {\n $0\n}");
@@ -252,10 +270,10 @@ pub(crate) fn complete_expr_path(
}
}
- if let Some(fn_def) = &ctx.function_def {
+ if let Some(ty) = ty {
add_keyword(
"return",
- match (in_block_expr, fn_def.ret_type().is_some()) {
+ match (in_block_expr, ty.is_unit()) {
(true, true) => "return ;",
(true, false) => "return;",
(false, true) => "return $0",