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.rs | 38 |
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", |