Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/pattern.rs')
| -rw-r--r-- | crates/ide-completion/src/completions/pattern.rs | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/crates/ide-completion/src/completions/pattern.rs b/crates/ide-completion/src/completions/pattern.rs index e2e8d3f205..91d5356541 100644 --- a/crates/ide-completion/src/completions/pattern.rs +++ b/crates/ide-completion/src/completions/pattern.rs @@ -13,9 +13,9 @@ use crate::{ pub(crate) fn complete_pattern( acc: &mut Completions, ctx: &CompletionContext, - patctx: &PatternContext, + pattern_ctx: &PatternContext, ) { - match patctx.parent_pat.as_ref() { + match pattern_ctx.parent_pat.as_ref() { Some(Pat::RangePat(_) | Pat::BoxPat(_)) => (), Some(Pat::RefPat(r)) => { if r.mut_token().is_none() { @@ -24,7 +24,7 @@ pub(crate) fn complete_pattern( } _ => { let tok = ctx.token.text_range().start(); - match (patctx.ref_token.as_ref(), patctx.mut_token.as_ref()) { + match (pattern_ctx.ref_token.as_ref(), pattern_ctx.mut_token.as_ref()) { (None, None) => { acc.add_keyword(ctx, "ref"); acc.add_keyword(ctx, "mut"); @@ -40,11 +40,11 @@ pub(crate) fn complete_pattern( } } - if patctx.record_pat.is_some() { + if pattern_ctx.record_pat.is_some() { return; } - let refutable = patctx.refutability == PatternRefutability::Refutable; + let refutable = pattern_ctx.refutability == PatternRefutability::Refutable; let single_variant_enum = |enum_: hir::Enum| ctx.db.enum_data(enum_.into()).variants.len() == 1; if let Some(hir::Adt::Enum(e)) = @@ -55,9 +55,9 @@ pub(crate) fn complete_pattern( acc, ctx, e, - &patctx.impl_, + &pattern_ctx.impl_, |acc, ctx, variant, path| { - acc.add_qualified_variant_pat(ctx, variant, path); + acc.add_qualified_variant_pat(ctx, pattern_ctx, variant, path); }, ); } @@ -69,26 +69,39 @@ pub(crate) fn complete_pattern( let add_simple_path = match res { hir::ScopeDef::ModuleDef(def) => match def { hir::ModuleDef::Adt(hir::Adt::Struct(strukt)) => { - acc.add_struct_pat(ctx, strukt, Some(name.clone())); + acc.add_struct_pat(ctx, pattern_ctx, strukt, Some(name.clone())); true } hir::ModuleDef::Variant(variant) if refutable || single_variant_enum(variant.parent_enum(ctx.db)) => { - acc.add_variant_pat(ctx, variant, Some(name.clone())); + acc.add_variant_pat(ctx, pattern_ctx, variant, Some(name.clone())); true } hir::ModuleDef::Adt(hir::Adt::Enum(e)) => refutable || single_variant_enum(e), hir::ModuleDef::Const(..) => refutable, hir::ModuleDef::Module(..) => true, hir::ModuleDef::Macro(mac) if mac.is_fn_like(ctx.db) => { - return acc.add_macro(ctx, mac, name) + return acc.add_macro( + ctx, + &PathCompletionCtx { + has_call_parens: false, + has_macro_bang: false, + qualified: Qualified::No, + parent: None, + kind: crate::context::PathKind::Pat { pat_ctx: pattern_ctx.clone() }, + has_type_args: false, + use_tree_parent: false, + }, + mac, + name, + ) } _ => false, }, hir::ScopeDef::ImplSelfType(impl_) => match impl_.self_ty(ctx.db).as_adt() { Some(hir::Adt::Struct(strukt)) => { - acc.add_struct_pat(ctx, strukt, Some(name.clone())); + acc.add_struct_pat(ctx, pattern_ctx, strukt, Some(name.clone())); true } Some(hir::Adt::Enum(e)) => refutable || single_variant_enum(e), @@ -111,7 +124,7 @@ pub(crate) fn complete_pattern( pub(crate) fn complete_pattern_path( acc: &mut Completions, ctx: &CompletionContext, - PathCompletionCtx { qualified, .. }: &PathCompletionCtx, + path_ctx @ PathCompletionCtx { qualified, .. }: &PathCompletionCtx, ) { match qualified { Qualified::With { resolution: Some(resolution), is_super_chain, .. } => { @@ -132,7 +145,7 @@ pub(crate) fn complete_pattern_path( }; if add_resolution { - acc.add_resolution(ctx, name, def); + acc.add_path_resolution(ctx, path_ctx, name, def); } } } @@ -150,9 +163,9 @@ pub(crate) fn complete_pattern_path( } hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Enum(e))) => { cov_mark::hit!(enum_plain_qualified_use_tree); - e.variants(ctx.db) - .into_iter() - .for_each(|variant| acc.add_enum_variant(ctx, variant, None)); + e.variants(ctx.db).into_iter().for_each(|variant| { + acc.add_enum_variant(ctx, path_ctx, variant, None) + }); e.ty(ctx.db) } hir::PathResolution::Def(hir::ModuleDef::Adt(hir::Adt::Union(u))) => { @@ -197,7 +210,7 @@ pub(crate) fn complete_pattern_path( ctx.process_all_names(&mut |name, res| { // FIXME: properly filter here if let ScopeDef::ModuleDef(_) = res { - acc.add_resolution(ctx, name, res); + acc.add_path_resolution(ctx, path_ctx, name, res); } }); |