use crate::completion::{CompletionContext, Completions}; /// Completes constats and paths in patterns. pub(super) fn complete_pattern(acc: &mut Completions, ctx: &CompletionContext) { if !ctx.is_pat_binding { return; } // FIXME: ideally, we should look at the type we are matching against and // suggest variants + auto-imports let names = ctx.analyzer.all_names(ctx.db); for (name, res) in names.into_iter() { let r = res.as_ref(); let def = match r.take_types().or_else(|| r.take_values()) { Some(hir::Resolution::Def(def)) => def, _ => continue, }; match def { hir::ModuleDef::Adt(hir::Adt::Enum(..)) | hir::ModuleDef::EnumVariant(..) | hir::ModuleDef::Const(..) | hir::ModuleDef::Module(..) => (), _ => continue, } acc.add_resolution(ctx, name.to_string(), &res) } } #[cfg(test)] mod tests { use crate::completion::{do_completion, CompletionItem, CompletionKind}; use insta::assert_debug_snapshot; fn complete(code: &str) -> Vec { do_completion(code, CompletionKind::Reference) } #[test] fn completes_enum_variants_and_modules() { let completions = complete( r" enum E { X } use self::E::X; const Z: E = E::X; mod m {} static FOO: E = E::X; struct Bar { f: u32 } fn foo() { match E::X { <|> } } ", ); assert_debug_snapshot!(completions, @r###" ⋮[ ⋮ CompletionItem { ⋮ label: "E", ⋮ source_range: [246; 246), ⋮ delete: [246; 246), ⋮ insert: "E", ⋮ kind: Enum, ⋮ }, ⋮ CompletionItem { ⋮ label: "X", ⋮ source_range: [246; 246), ⋮ delete: [246; 246), ⋮ insert: "X", ⋮ kind: EnumVariant, ⋮ }, ⋮ CompletionItem { ⋮ label: "Z", ⋮ source_range: [246; 246), ⋮ delete: [246; 246), ⋮ insert: "Z", ⋮ kind: Const, ⋮ }, ⋮ CompletionItem { ⋮ label: "m", ⋮ source_range: [246; 246), ⋮ delete: [246; 246), ⋮ insert: "m", ⋮ kind: Module, ⋮ }, ⋮] "###); } }