Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/render/pattern.rs')
| -rw-r--r-- | crates/ide-completion/src/render/pattern.rs | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/crates/ide-completion/src/render/pattern.rs b/crates/ide-completion/src/render/pattern.rs index 74564bb3aa..463d292955 100644 --- a/crates/ide-completion/src/render/pattern.rs +++ b/crates/ide-completion/src/render/pattern.rs @@ -6,16 +6,14 @@ use itertools::Itertools; use syntax::SmolStr; use crate::{ - context::{ - IdentContext, NameContext, NameKind, NameRefContext, NameRefKind, ParamKind, - PathCompletionCtx, PathKind, PatternContext, - }, + context::{ParamKind, PatternContext}, render::{variant::visible_fields, RenderContext}, CompletionItem, CompletionItemKind, }; pub(crate) fn render_struct_pat( ctx: RenderContext<'_>, + pattern_ctx: &PatternContext, strukt: hir::Struct, local_name: Option<Name>, ) -> Option<CompletionItem> { @@ -30,13 +28,21 @@ pub(crate) fn render_struct_pat( } let name = local_name.unwrap_or_else(|| strukt.name(ctx.db())).to_smol_str(); - let pat = render_pat(&ctx, &name, strukt.kind(ctx.db()), &visible_fields, fields_omitted)?; + let pat = render_pat( + &ctx, + pattern_ctx, + &name, + strukt.kind(ctx.db()), + &visible_fields, + fields_omitted, + )?; Some(build_completion(ctx, name, pat, strukt)) } pub(crate) fn render_variant_pat( ctx: RenderContext<'_>, + pattern_ctx: &PatternContext, variant: hir::Variant, local_name: Option<Name>, path: Option<&hir::ModPath>, @@ -50,7 +56,14 @@ pub(crate) fn render_variant_pat( Some(path) => path.to_string().into(), None => local_name.unwrap_or_else(|| variant.name(ctx.db())).to_smol_str(), }; - let pat = render_pat(&ctx, &name, variant.kind(ctx.db()), &visible_fields, fields_omitted)?; + let pat = render_pat( + &ctx, + pattern_ctx, + &name, + variant.kind(ctx.db()), + &visible_fields, + fields_omitted, + )?; Some(build_completion(ctx, name, pat, variant)) } @@ -75,49 +88,28 @@ fn build_completion( fn render_pat( ctx: &RenderContext<'_>, + pattern_ctx: &PatternContext, name: &str, kind: StructKind, fields: &[hir::Field], fields_omitted: bool, ) -> Option<String> { - let has_call_parens = matches!( - ctx.completion.ident_ctx, - IdentContext::NameRef(NameRefContext { - kind: NameRefKind::Path(PathCompletionCtx { has_call_parens: true, .. }), - .. - }) - ); let mut pat = match kind { - StructKind::Tuple if !has_call_parens => { - render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted) - } - StructKind::Record if !has_call_parens => { + StructKind::Tuple => render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted), + StructKind::Record => { render_record_as_pat(ctx.db(), ctx.snippet_cap(), fields, name, fields_omitted) } StructKind::Unit => return None, - _ => name.to_owned(), }; - let needs_ascription = !has_call_parens - && matches!( - &ctx.completion.ident_ctx, - IdentContext::NameRef(NameRefContext { - kind: NameRefKind::Path(PathCompletionCtx { - kind: PathKind::Pat { - pat_ctx - }, - .. - }), - .. - }) | IdentContext::Name(NameContext { - kind: NameKind::IdentPat(pat_ctx), ..} - ) - if matches!(pat_ctx, PatternContext { - param_ctx: Some((.., ParamKind::Function(_))), - has_type_ascription: false, - .. - }) - ); + let needs_ascription = matches!( + pattern_ctx, + PatternContext { + param_ctx: Some((.., ParamKind::Function(_))), + has_type_ascription: false, + .. + } + ); if needs_ascription { pat.push(':'); pat.push(' '); |