1377: Use inline snapshots in complete_keyword r=matklad a=sbihel

Relates to #1127

Co-authored-by: Simon Bihel <simon.bihel@ens-rennes.fr>
This commit is contained in:
bors[bot] 2019-06-06 13:10:46 +00:00
commit 8ba5617613
14 changed files with 580 additions and 644 deletions

View file

@ -109,52 +109,149 @@ fn complete_return(
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::completion::{check_completion, CompletionKind}; use crate::completion::{do_completion, CompletionItem, CompletionKind};
use insta::assert_debug_snapshot_matches;
fn check_keyword_completion(name: &str, code: &str) { fn do_keyword_completion(code: &str) -> Vec<CompletionItem> {
check_completion(name, code, CompletionKind::Keyword); do_completion(code, CompletionKind::Keyword)
} }
#[test] #[test]
fn completes_keywords_in_use_stmt() { fn completes_keywords_in_use_stmt() {
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_use_stmt1", do_keyword_completion(
r" r"
use <|> use <|>
", ",
),
@r###"[
CompletionItem {
label: "crate",
source_range: [21; 21),
delete: [21; 21),
insert: "crate::",
kind: Keyword,
},
CompletionItem {
label: "self",
source_range: [21; 21),
delete: [21; 21),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [21; 21),
delete: [21; 21),
insert: "super::",
kind: Keyword,
},
]"###
); );
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_use_stmt2", do_keyword_completion(
r" r"
use a::<|> use a::<|>
", ",
),
@r###"[
CompletionItem {
label: "self",
source_range: [24; 24),
delete: [24; 24),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [24; 24),
delete: [24; 24),
insert: "super::",
kind: Keyword,
},
]"###
); );
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_use_stmt3", do_keyword_completion(
r" r"
use a::{b, <|>} use a::{b, <|>}
", ",
),
@r###"[
CompletionItem {
label: "self",
source_range: [28; 28),
delete: [28; 28),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [28; 28),
delete: [28; 28),
insert: "super::",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn completes_various_keywords_in_function() { fn completes_various_keywords_in_function() {
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_function1", do_keyword_completion(
r" r"
fn quux() { fn quux() {
<|> <|>
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [49; 49),
delete: [49; 49),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [49; 49),
delete: [49; 49),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [49; 49),
delete: [49; 49),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [49; 49),
delete: [49; 49),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [49; 49),
delete: [49; 49),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn completes_else_after_if() { fn completes_else_after_if() {
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_function2", do_keyword_completion(
r" r"
fn quux() { fn quux() {
if true { if true {
@ -162,35 +259,163 @@ mod tests {
} <|> } <|>
} }
", ",
),
@r###"[
CompletionItem {
label: "else",
source_range: [108; 108),
delete: [108; 108),
insert: "else {$0}",
kind: Keyword,
},
CompletionItem {
label: "else if",
source_range: [108; 108),
delete: [108; 108),
insert: "else if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [108; 108),
delete: [108; 108),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [108; 108),
delete: [108; 108),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [108; 108),
delete: [108; 108),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [108; 108),
delete: [108; 108),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [108; 108),
delete: [108; 108),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn test_completion_return_value() { fn test_completion_return_value() {
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_function3", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
<|> <|>
92 92
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [56; 56),
delete: [56; 56),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [56; 56),
delete: [56; 56),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [56; 56),
delete: [56; 56),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [56; 56),
delete: [56; 56),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [56; 56),
delete: [56; 56),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
check_keyword_completion( assert_debug_snapshot_matches!(
"keywords_in_function4", do_keyword_completion(
r" r"
fn quux() { fn quux() {
<|> <|>
92 92
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [49; 49),
delete: [49; 49),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [49; 49),
delete: [49; 49),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [49; 49),
delete: [49; 49),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [49; 49),
delete: [49; 49),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [49; 49),
delete: [49; 49),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn dont_add_semi_after_return_if_not_a_statement() { fn dont_add_semi_after_return_if_not_a_statement() {
check_keyword_completion( assert_debug_snapshot_matches!(
"dont_add_semi_after_return_if_not_a_statement", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
match () { match () {
@ -198,13 +423,51 @@ mod tests {
} }
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [97; 97),
delete: [97; 97),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [97; 97),
delete: [97; 97),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [97; 97),
delete: [97; 97),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [97; 97),
delete: [97; 97),
insert: "return $0",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [97; 97),
delete: [97; 97),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn last_return_in_block_has_semi() { fn last_return_in_block_has_semi() {
check_keyword_completion( assert_debug_snapshot_matches!(
"last_return_in_block_has_semi1", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
if condition { if condition {
@ -212,9 +475,47 @@ mod tests {
} }
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [95; 95),
delete: [95; 95),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [95; 95),
delete: [95; 95),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [95; 95),
delete: [95; 95),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [95; 95),
delete: [95; 95),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [95; 95),
delete: [95; 95),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
check_keyword_completion( assert_debug_snapshot_matches!(
"last_return_in_block_has_semi2", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
if condition { if condition {
@ -224,35 +525,163 @@ mod tests {
x x
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [95; 95),
delete: [95; 95),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [95; 95),
delete: [95; 95),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [95; 95),
delete: [95; 95),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [95; 95),
delete: [95; 95),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [95; 95),
delete: [95; 95),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn completes_break_and_continue_in_loops() { fn completes_break_and_continue_in_loops() {
check_keyword_completion( assert_debug_snapshot_matches!(
"completes_break_and_continue_in_loops1", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
loop { <|> } loop { <|> }
} }
", ",
),
@r###"[
CompletionItem {
label: "break",
source_range: [63; 63),
delete: [63; 63),
insert: "break;",
kind: Keyword,
},
CompletionItem {
label: "continue",
source_range: [63; 63),
delete: [63; 63),
insert: "continue;",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [63; 63),
delete: [63; 63),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [63; 63),
delete: [63; 63),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [63; 63),
delete: [63; 63),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [63; 63),
delete: [63; 63),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [63; 63),
delete: [63; 63),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
// No completion: lambda isolates control flow // No completion: lambda isolates control flow
check_keyword_completion( assert_debug_snapshot_matches!(
"completes_break_and_continue_in_loops2", do_keyword_completion(
r" r"
fn quux() -> i32 { fn quux() -> i32 {
loop { || { <|> } } loop { || { <|> } }
} }
", ",
),
@r###"[
CompletionItem {
label: "if",
source_range: [68; 68),
delete: [68; 68),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [68; 68),
delete: [68; 68),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [68; 68),
delete: [68; 68),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [68; 68),
delete: [68; 68),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [68; 68),
delete: [68; 68),
insert: "while $0 {}",
kind: Keyword,
},
]"###
); );
} }
#[test] #[test]
fn no_semi_after_break_continue_in_expr() { fn no_semi_after_break_continue_in_expr() {
check_keyword_completion( assert_debug_snapshot_matches!(
"no_semi_after_break_continue_in_expr", do_keyword_completion(
r" r"
fn f() { fn f() {
loop { loop {
@ -262,6 +691,58 @@ mod tests {
} }
} }
", ",
),
@r###"[
CompletionItem {
label: "break",
source_range: [122; 124),
delete: [122; 124),
insert: "break",
kind: Keyword,
},
CompletionItem {
label: "continue",
source_range: [122; 124),
delete: [122; 124),
insert: "continue",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [122; 124),
delete: [122; 124),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [122; 124),
delete: [122; 124),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [122; 124),
delete: [122; 124),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [122; 124),
delete: [122; 124),
insert: "return",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [122; 124),
delete: [122; 124),
insert: "while $0 {}",
kind: Keyword,
},
]"###
) )
} }
} }

View file

@ -1,57 +0,0 @@
---
created: "2019-05-23T22:23:35.067956470Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "break",
source_range: [55; 55),
delete: [55; 55),
insert: "break;",
kind: Keyword,
},
CompletionItem {
label: "continue",
source_range: [55; 55),
delete: [55; 55),
insert: "continue;",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [55; 55),
delete: [55; 55),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [55; 55),
delete: [55; 55),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [55; 55),
delete: [55; 55),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [55; 55),
delete: [55; 55),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [55; 55),
delete: [55; 55),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:44:10.859967190Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [60; 60),
delete: [60; 60),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [60; 60),
delete: [60; 60),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [60; 60),
delete: [60; 60),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [60; 60),
delete: [60; 60),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [60; 60),
delete: [60; 60),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:23:35.081993214Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [85; 85),
delete: [85; 85),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [85; 85),
delete: [85; 85),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [85; 85),
delete: [85; 85),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [85; 85),
delete: [85; 85),
insert: "return $0",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [85; 85),
delete: [85; 85),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:23:35.075690846Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [41; 41),
delete: [41; 41),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [41; 41),
delete: [41; 41),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [41; 41),
delete: [41; 41),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [41; 41),
delete: [41; 41),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [41; 41),
delete: [41; 41),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,57 +0,0 @@
---
created: "2019-05-23T22:23:35.068799431Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "else",
source_range: [92; 92),
delete: [92; 92),
insert: "else {$0}",
kind: Keyword,
},
CompletionItem {
label: "else if",
source_range: [92; 92),
delete: [92; 92),
insert: "else if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [92; 92),
delete: [92; 92),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [92; 92),
delete: [92; 92),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [92; 92),
delete: [92; 92),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [92; 92),
delete: [92; 92),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [92; 92),
delete: [92; 92),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:23:35.085655258Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [48; 48),
delete: [48; 48),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [48; 48),
delete: [48; 48),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [48; 48),
delete: [48; 48),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [48; 48),
delete: [48; 48),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [48; 48),
delete: [48; 48),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:44:10.869539856Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [41; 41),
delete: [41; 41),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [41; 41),
delete: [41; 41),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [41; 41),
delete: [41; 41),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [41; 41),
delete: [41; 41),
insert: "return;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [41; 41),
delete: [41; 41),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,29 +0,0 @@
---
created: "2019-05-23T22:23:35.066687241Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "crate",
source_range: [17; 17),
delete: [17; 17),
insert: "crate::",
kind: Keyword,
},
CompletionItem {
label: "self",
source_range: [17; 17),
delete: [17; 17),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [17; 17),
delete: [17; 17),
insert: "super::",
kind: Keyword,
},
]

View file

@ -1,22 +0,0 @@
---
created: "2019-05-23T22:44:10.859494330Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "self",
source_range: [20; 20),
delete: [20; 20),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [20; 20),
delete: [20; 20),
insert: "super::",
kind: Keyword,
},
]

View file

@ -1,22 +0,0 @@
---
created: "2019-05-23T22:44:40.506690279Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "self",
source_range: [24; 24),
delete: [24; 24),
insert: "self",
kind: Keyword,
},
CompletionItem {
label: "super",
source_range: [24; 24),
delete: [24; 24),
insert: "super::",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:23:35.082403612Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [83; 83),
delete: [83; 83),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [83; 83),
delete: [83; 83),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [83; 83),
delete: [83; 83),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [83; 83),
delete: [83; 83),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [83; 83),
delete: [83; 83),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,43 +0,0 @@
---
created: "2019-05-23T22:44:10.871868390Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "if",
source_range: [83; 83),
delete: [83; 83),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [83; 83),
delete: [83; 83),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [83; 83),
delete: [83; 83),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [83; 83),
delete: [83; 83),
insert: "return $0;",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [83; 83),
delete: [83; 83),
insert: "while $0 {}",
kind: Keyword,
},
]

View file

@ -1,57 +0,0 @@
---
created: "2019-05-23T22:23:35.085365816Z"
creator: insta@0.8.1
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
---
[
CompletionItem {
label: "break",
source_range: [106; 108),
delete: [106; 108),
insert: "break",
kind: Keyword,
},
CompletionItem {
label: "continue",
source_range: [106; 108),
delete: [106; 108),
insert: "continue",
kind: Keyword,
},
CompletionItem {
label: "if",
source_range: [106; 108),
delete: [106; 108),
insert: "if $0 {}",
kind: Keyword,
},
CompletionItem {
label: "loop",
source_range: [106; 108),
delete: [106; 108),
insert: "loop {$0}",
kind: Keyword,
},
CompletionItem {
label: "match",
source_range: [106; 108),
delete: [106; 108),
insert: "match $0 {}",
kind: Keyword,
},
CompletionItem {
label: "return",
source_range: [106; 108),
delete: [106; 108),
insert: "return",
kind: Keyword,
},
CompletionItem {
label: "while",
source_range: [106; 108),
delete: [106; 108),
insert: "while $0 {}",
kind: Keyword,
},
]