1 //! Completes lifetimes and labels.
4 use crate::{completions::Completions, context::CompletionContext};
6 /// Completes lifetimes.
7 pub(crate) fn complete_lifetime(acc: &mut Completions, ctx: &CompletionContext) {
8 if !ctx.lifetime_allowed {
12 let param_lifetime = match (
14 ctx.lifetime_param_syntax.as_ref().and_then(|lp| lp.lifetime()),
16 (Some(lt), Some(lp)) if lp == lt.clone() => return,
17 (Some(_), Some(lp)) => {
18 lp_string = lp.to_string();
24 ctx.scope.process_all_names(&mut |name, res| {
25 if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) = res {
26 if param_lifetime != Some(&*name.to_string()) {
27 acc.add_resolution(ctx, name, &res);
31 if param_lifetime.is_none() {
32 acc.add_static_lifetime(ctx);
37 pub(crate) fn complete_label(acc: &mut Completions, ctx: &CompletionContext) {
38 if !ctx.is_label_ref {
41 ctx.scope.process_all_names(&mut |name, res| {
42 if let ScopeDef::Label(_) = res {
43 acc.add_resolution(ctx, name, &res);
50 use expect_test::{expect, Expect};
53 test_utils::{check_edit, completion_list_with_config, TEST_CONFIG},
54 CompletionConfig, CompletionKind,
57 fn check(ra_fixture: &str, expect: Expect) {
58 check_with_config(TEST_CONFIG, ra_fixture, expect);
61 fn check_with_config(config: CompletionConfig, ra_fixture: &str, expect: Expect) {
62 let actual = completion_list_with_config(config, ra_fixture, CompletionKind::Reference);
63 expect.assert_eq(&actual)
67 fn check_lifetime_edit() {
71 fn func<'lifetime>(foo: &'li$0) {}
74 fn func<'lifetime>(foo: &'lifetime) {}
77 cov_mark::check!(completes_if_lifetime_without_idents);
81 fn func<'lifetime>(foo: &'$0) {}
84 fn func<'lifetime>(foo: &'lifetime) {}
90 fn complete_lifetime_in_ref() {
93 fn foo<'lifetime>(foo: &'a$0 usize) {}
103 fn complete_lifetime_in_ref_missing_ty() {
106 fn foo<'lifetime>(foo: &'a$0) {}
115 fn complete_lifetime_in_self_ref() {
120 fn foo<'func>(&'a$0 self) {}
132 fn complete_lifetime_in_arg_list() {
136 fn foo<'lifetime>(_: Foo<'a$0>) {}
146 fn complete_lifetime_in_where_pred() {
149 fn foo2<'lifetime, T>() where 'a$0 {}
159 fn complete_lifetime_in_ty_bound() {
162 fn foo2<'lifetime, T>() where T: 'a$0 {}
171 fn foo2<'lifetime, T>() where T: Trait<'a$0> {}
181 fn dont_complete_lifetime_in_assoc_ty_bound() {
184 fn foo2<'lifetime, T>() where T: Trait<Item = 'a$0> {}
191 fn complete_lifetime_in_param_list() {
200 fn foo<'footime, 'lifetime: 'a$0>() {}
209 fn check_label_edit() {
230 fn complete_label_in_loop() {
258 fn complete_label_in_block_nested() {
277 fn complete_label_in_loop_with_value() {
293 fn complete_label_in_while_cond() {
297 'outer: while { 'inner: loop { break '$0 } } {}
308 fn complete_label_in_for_iterable() {
312 'outer: for _ in [{ 'inner: loop { break '$0 } }] {}