From 330ce2e26baf6f9ebf808e16140f6ad9c9b05d5e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 24 Feb 2019 23:49:47 +0300 Subject: complete patterns --- .../ra_ide_api/src/completion/complete_pattern.rs | 87 ++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 crates/ra_ide_api/src/completion/complete_pattern.rs (limited to 'crates/ra_ide_api/src/completion/complete_pattern.rs') diff --git a/crates/ra_ide_api/src/completion/complete_pattern.rs b/crates/ra_ide_api/src/completion/complete_pattern.rs new file mode 100644 index 000000000..3cf79c080 --- /dev/null +++ b/crates/ra_ide_api/src/completion/complete_pattern.rs @@ -0,0 +1,87 @@ +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; + } + // TODO: ideally, we should look at the type we are matching against and + // suggest variants + auto-imports + let names = ctx.resolver.all_names(ctx.db); + for (name, res) in names.into_iter() { + let r = res.as_ref(); + let def = match r.take_types().or(r.take_values()) { + Some(hir::Resolution::Def(def)) => def, + _ => continue, + }; + match def { + hir::ModuleDef::Enum(..) + | hir::ModuleDef::EnumVariant(..) + | hir::ModuleDef::Const(..) + | hir::ModuleDef::Module(..) => (), + _ => continue, + } + acc.add_resolution(ctx, name.to_string(), &res) + } +} + +#[cfg(test)] +mod tests { + use insta::assert_debug_snapshot_matches; + use crate::completion::{CompletionItem, CompletionKind, do_completion}; + + 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_matches!(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 + } +]"###); + } +} -- cgit v1.2.3