1 //! Completion of names from the current scope, e.g. locals and imported items.
5 use crate::{CompletionContext, Completions};
7 pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
8 if !ctx.is_trivial_path {
11 if ctx.is_path_disallowed() || ctx.expects_item() {
15 if ctx.expects_assoc_item() {
16 ctx.scope.process_all_names(&mut |name, def| {
17 if let ScopeDef::MacroDef(macro_def) = def {
18 acc.add_macro(ctx, Some(name.clone()), macro_def);
20 if let ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = def {
21 acc.add_resolution(ctx, name, &def);
27 if ctx.expects_use_tree() {
28 cov_mark::hit!(only_completes_modules_in_import);
29 ctx.scope.process_all_names(&mut |name, res| {
30 if let ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = res {
31 acc.add_resolution(ctx, name, &res);
37 if let Some(hir::Adt::Enum(e)) =
38 ctx.expected_type.as_ref().and_then(|ty| ty.strip_references().as_adt())
40 super::complete_enum_variants(acc, ctx, e, |acc, ctx, variant, path| {
41 acc.add_qualified_enum_variant(ctx, variant, path)
45 ctx.scope.process_all_names(&mut |name, res| {
46 if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) = res {
47 cov_mark::hit!(skip_lifetime_completion);
50 acc.add_resolution(ctx, name, &res);
56 use expect_test::{expect, Expect};
59 test_utils::{check_edit, completion_list_with_config, TEST_CONFIG},
60 CompletionConfig, CompletionKind,
63 fn check(ra_fixture: &str, expect: Expect) {
64 check_with_config(TEST_CONFIG, ra_fixture, expect);
67 fn check_with_config(config: CompletionConfig, ra_fixture: &str, expect: Expect) {
68 let actual = completion_list_with_config(config, ra_fixture, CompletionKind::Reference);
69 expect.assert_eq(&actual)
73 fn only_completes_modules_in_import() {
74 cov_mark::check!(only_completes_modules_in_import);
89 fn bind_pat_and_path_ignore_at() {
93 fn quux(x: Option<Enum>) {
96 Some(en$0 @ Enum::A) => (),
105 fn bind_pat_and_path_ignore_ref() {
109 fn quux(x: Option<Enum>) {
112 Some(ref en$0) => (),
121 fn bind_pat_and_path() {
125 fn quux(x: Option<Enum>) {
139 fn completes_bindings_from_let() {
157 fn completes_bindings_from_if_let() {
161 if let Some(x) = foo() {
164 if let Some(a) = bar() {
179 fn completes_bindings_from_for() {
183 for x in &[1, 2, 3] { $0 }
194 fn completes_if_prefix_is_keyword() {
195 cov_mark::check!(completes_if_prefix_is_keyword);
214 fn completes_generic_params() {
216 r#"fn quux<T>() { $0 }"#,
223 r#"fn quux<const C: usize>() { $0 }"#,
232 fn does_not_complete_lifetimes() {
233 cov_mark::check!(skip_lifetime_completion);
235 r#"fn quux<'a>() { $0 }"#,
243 fn completes_generic_params_in_struct() {
245 r#"struct S<T> { x: $0}"#,
255 fn completes_self_in_enum() {
257 r#"enum X { Y($0) }"#,
266 fn completes_module_items() {
281 /// Regression test for issue #6091.
283 fn correctly_completes_module_items_prefixed_with_underscore() {
302 fn completes_extern_prelude() {
305 //- /lib.rs crate:main deps:other_crate
308 //- /other_crate/lib.rs crate:other_crate
318 fn completes_module_items_in_nested_modules() {
335 fn completes_return_type() {
349 fn dont_show_both_completions_for_shadowing() {
360 // FIXME: should be only one bar here
370 fn completes_self_in_methods() {
372 r#"impl S { fn foo(&self) { $0 } }"#,
381 fn completes_prelude() {
384 //- /main.rs crate:main deps:std
385 fn foo() { let x: $0 }
387 //- /std/lib.rs crate:std
391 mod prelude { struct Option; }
402 fn completes_prelude_macros() {
405 //- /main.rs crate:main deps:std
408 //- /std/lib.rs crate:std
414 pub use crate::concat;
418 #[rustc_builtin_macro]
420 macro_rules! concat { }
425 ma concat!(…) #[macro_export] macro_rules! concat
432 fn completes_std_prelude_if_core_is_defined() {
435 //- /main.rs crate:main deps:core,std
436 fn foo() { let x: $0 }
438 //- /core/lib.rs crate:core
442 mod prelude { struct Option; }
444 //- /std/lib.rs crate:std deps:core
448 mod prelude { struct String; }
460 fn completes_macros_as_value() {
463 macro_rules! foo { () => {} }
467 macro_rules! bar { () => {} }
471 macro_rules! nope { () => {} }
474 macro_rules! baz { () => {} }
477 fn main() { let v = $0 }
481 ma baz!(…) #[macro_export] macro_rules! baz
484 ma bar!(…) macro_rules! bar
485 ma foo!(…) macro_rules! foo
491 fn completes_both_macro_and_value() {
494 macro_rules! foo { () => {} }
499 ma foo!(…) macro_rules! foo
505 fn completes_macros_as_type() {
508 macro_rules! foo { () => {} }
509 fn main() { let x: $0 }
513 ma foo!(…) macro_rules! foo
519 fn completes_macros_as_stmt() {
522 macro_rules! foo { () => {} }
527 ma foo!(…) macro_rules! foo
533 fn completes_local_item() {
549 fn completes_in_simple_macro_1() {
552 macro_rules! m { ($e:expr) => { $e } }
562 ma m!(…) macro_rules! m
568 fn completes_in_simple_macro_2() {
571 macro_rules! m { ($e:expr) => { $e } }
581 ma m!(…) macro_rules! m
587 fn completes_in_simple_macro_without_closing_parens() {
590 macro_rules! m { ($e:expr) => { $e } }
600 ma m!(…) macro_rules! m
606 fn completes_unresolved_uses() {
621 fn completes_enum_variant_basic_expr() {
624 enum Foo { Bar, Baz, Quux }
625 fn main() { let foo: Foo = Q$0 }
638 fn completes_enum_variant_from_module() {
641 mod m { pub enum E { V } }
642 fn f() -> m::E { V$0 }
653 fn dont_complete_attr() {
665 fn completes_target_type_or_trait_in_impl_block() {
682 fn completes_in_assoc_item_list() {
695 ma foo! macro_rules! foo
700 // FIXME: The completions here currently come from `macro_in_item_position`, but they shouldn't
702 fn completes_in_item_list() {
713 ma foo!(…) macro_rules! foo