Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/render/function.rs')
| -rw-r--r-- | crates/ide-completion/src/render/function.rs | 87 |
1 files changed, 42 insertions, 45 deletions
diff --git a/crates/ide-completion/src/render/function.rs b/crates/ide-completion/src/render/function.rs index 48539a03b1..3666ee40e2 100644 --- a/crates/ide-completion/src/render/function.rs +++ b/crates/ide-completion/src/render/function.rs @@ -8,8 +8,7 @@ use syntax::SmolStr; use crate::{ context::{ - CompletionContext, DotAccess, DotAccessKind, IdentContext, NameRefContext, NameRefKind, - PathCompletionCtx, PathKind, Qualified, + CompletionContext, DotAccess, DotAccessKind, PathCompletionCtx, PathKind, Qualified, }, item::{Builder, CompletionItem, CompletionItemKind, CompletionRelevance}, render::{compute_exact_name_match, compute_ref_match, compute_type_match, RenderContext}, @@ -23,21 +22,54 @@ enum FuncKind { pub(crate) fn render_fn( ctx: RenderContext<'_>, + path_ctx: &PathCompletionCtx, local_name: Option<hir::Name>, func: hir::Function, ) -> Builder { let _p = profile::span("render_fn"); - render(ctx, local_name, func, FuncKind::Function) + let func_kind = FuncKind::Function; + let params = match ctx.completion.config.snippet_cap { + Some(_) => { + if !matches!( + path_ctx, + PathCompletionCtx { kind: PathKind::Expr { .. }, has_call_parens: true, .. } + | PathCompletionCtx { kind: PathKind::Use | PathKind::Type { .. }, .. } + ) { + params(ctx.completion, func, &func_kind, false) + } else { + None + } + } + _ => None, + }; + render( + ctx, + local_name, + func, + func_kind, + params, + matches!(path_ctx.qualified, Qualified::With { .. }), + ) } pub(crate) fn render_method( ctx: RenderContext<'_>, + dot_access: &DotAccess, receiver: Option<hir::Name>, local_name: Option<hir::Name>, func: hir::Function, ) -> Builder { let _p = profile::span("render_method"); - render(ctx, local_name, func, FuncKind::Method(receiver)) + let func_kind = FuncKind::Method(receiver); + let params = match ctx.completion.config.snippet_cap { + Some(_) => match dot_access { + DotAccess { kind: DotAccessKind::Method { has_parens: true }, .. } => None, + _ => params(ctx.completion, func, &func_kind, true), + }, + _ => None, + }; + + render(ctx, local_name, func, func_kind, params, false) } fn render( @@ -45,6 +77,8 @@ fn render( local_name: Option<hir::Name>, func: hir::Function, func_kind: FuncKind, + params: Option<(Option<hir::SelfParam>, Vec<hir::Param>)>, + qualified_path: bool, ) -> Builder { let db = completion.db; @@ -80,16 +114,6 @@ fn render( // FIXME For now we don't properly calculate the edits for ref match // completions on methods or qualified paths, so we've disabled them. // See #8058. - let qualified_path = matches!( - ctx.completion.ident_ctx, - IdentContext::NameRef(NameRefContext { - kind: NameRefKind::Path(PathCompletionCtx { - qualified: Qualified::With { .. }, - .. - }), - .. - }) - ); if matches!(func_kind, FuncKind::Function) && !qualified_path { item.ref_match(ref_match); } @@ -100,11 +124,9 @@ fn render( .detail(detail(db, func)) .lookup_by(name.to_smol_str()); - match completion.config.snippet_cap { - Some(cap) => { - if let Some((self_param, params)) = params(completion, func, &func_kind) { - add_call_parens(&mut item, completion, cap, call, self_param, params); - } + match completion.config.snippet_cap.zip(params) { + Some((cap, (self_param, params))) => { + add_call_parens(&mut item, completion, cap, call, self_param, params); } _ => (), } @@ -254,37 +276,12 @@ fn params( ctx: &CompletionContext<'_>, func: hir::Function, func_kind: &FuncKind, + has_dot_receiver: bool, ) -> Option<(Option<hir::SelfParam>, Vec<hir::Param>)> { if ctx.config.callable.is_none() { return None; } - let has_dot_receiver = match ctx.ident_ctx { - IdentContext::NameRef(NameRefContext { - kind: - NameRefKind::DotAccess(DotAccess { - kind: DotAccessKind::Method { has_parens: true }, - .. - }), - .. - }) => return None, - IdentContext::NameRef(NameRefContext { - kind: NameRefKind::DotAccess(DotAccess { .. }), - .. - }) => true, - IdentContext::NameRef(NameRefContext { - kind: - NameRefKind::Path( - PathCompletionCtx { - kind: PathKind::Expr { .. }, has_call_parens: true, .. - } - | PathCompletionCtx { kind: PathKind::Use | PathKind::Type { .. }, .. }, - ), - .. - }) => return None, - _ => false, - }; - // Don't add parentheses if the expected type is some function reference. if let Some(ty) = &ctx.expected_type { // FIXME: check signature matches? |