From 62a4677dbc6cf1c90e4558c3c73fef201a0d1080 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 21 Mar 2021 01:00:09 +0100 Subject: Add label completion --- crates/ide_completion/src/completions/lifetime.rs | 77 ++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) (limited to 'crates/ide_completion/src/completions/lifetime.rs') diff --git a/crates/ide_completion/src/completions/lifetime.rs b/crates/ide_completion/src/completions/lifetime.rs index 74eb23360..07be28e9c 100644 --- a/crates/ide_completion/src/completions/lifetime.rs +++ b/crates/ide_completion/src/completions/lifetime.rs @@ -1,4 +1,4 @@ -//! Completes lifetimes. +//! Completes lifetimes and labels. use hir::ScopeDef; use crate::{completions::Completions, context::CompletionContext}; @@ -29,6 +29,18 @@ pub(crate) fn complete_lifetime(acc: &mut Completions, ctx: &CompletionContext) } } +/// Completes labels. +pub(crate) fn complete_label(acc: &mut Completions, ctx: &CompletionContext) { + if !ctx.is_label_ref { + return; + } + ctx.scope.process_all_names(&mut |name, res| { + if let ScopeDef::Label(_) = res { + acc.add_resolution(ctx, name.to_string(), &res); + } + }); +} + #[cfg(test)] mod tests { use expect_test::{expect, Expect}; @@ -178,4 +190,67 @@ fn foo<'footime, 'lifetime: 'a$0>() {} "#]], ); } + + #[test] + fn complete_label_in_loop() { + check( + r#" +fn foo() { + 'foop: loop { + break '$0 + } +} +"#, + expect![[r#" + lb 'foop + "#]], + ); + check( + r#" +fn foo() { + 'foop: loop { + continue '$0 + } +} +"#, + expect![[r#" + lb 'foop + "#]], + ); + } + + #[test] + fn complete_label_in_block_nested() { + check( + r#" +fn foo() { + 'foop: { + 'baap: { + break '$0 + } + } +} +"#, + expect![[r#" + lb 'baap + lb 'foop + "#]], + ); + } + + #[test] + fn complete_label_in_loop_with_value() { + check( + r#" +fn foo() { + 'foop: loop { + break '$0 i32; + } +} +"#, + expect![[r#" + lb 'foop + "#]], + ); + } } -- cgit v1.2.3 From 64957acb5f359763395a54e314d1f5d5cfc6ccf3 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 21 Mar 2021 01:10:59 +0100 Subject: Fix incorrect scoping in while expressions --- crates/ide_completion/src/completions/lifetime.rs | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'crates/ide_completion/src/completions/lifetime.rs') diff --git a/crates/ide_completion/src/completions/lifetime.rs b/crates/ide_completion/src/completions/lifetime.rs index 07be28e9c..628c1fb9b 100644 --- a/crates/ide_completion/src/completions/lifetime.rs +++ b/crates/ide_completion/src/completions/lifetime.rs @@ -253,4 +253,33 @@ fn foo() { "#]], ); } + + #[test] + fn complete_label_in_while_cond() { + check( + r#" +fn foo() { + 'outer: while { 'inner: loop { break '$0 } } {} +} +"#, + expect![[r#" + lb 'inner + lb 'outer + "#]], + ); + } + + #[test] + fn complete_label_in_for_iterable() { + check( + r#" +fn foo() { + 'outer: for _ in [{ 'inner: loop { break '$0 } }] {} +} +"#, + expect![[r#" + lb 'inner + "#]], + ); + } } -- cgit v1.2.3