Skip to content

Commit 396167e

Browse files
committed
New testing approach for keywords
1 parent a2b4385 commit 396167e

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

crates/ra_ide/src/completion/complete_keyword.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
7676
add_keyword(ctx, acc, "else if", "else if $0 {}", ctx.after_if);
7777
add_keyword(ctx, acc, "mod", "mod $0 {}", ctx.is_new_item || ctx.block_expr_parent);
7878
add_keyword(ctx, acc, "mut", "mut ", ctx.bind_pat_parent || ctx.ref_pat_parent);
79-
add_keyword(ctx, acc, "true", "true", !ctx.is_new_item); // this should be defined properly
80-
add_keyword(ctx, acc, "false", "false", !ctx.is_new_item); // this should be defined properly
8179
add_keyword(ctx, acc, "const", "const ", ctx.is_new_item || ctx.block_expr_parent);
8280
add_keyword(ctx, acc, "type", "type ", ctx.is_new_item || ctx.block_expr_parent);
8381
add_keyword(ctx, acc, "static", "static ", ctx.is_new_item || ctx.block_expr_parent);
@@ -89,7 +87,6 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
8987
add_keyword(ctx, acc, "break", "break", ctx.in_loop_body && !ctx.can_be_stmt);
9088
add_keyword(ctx, acc, "pub", "pub ", ctx.is_new_item && !ctx.inside_trait);
9189
add_keyword(ctx, acc, "where", "where ", ctx.trait_as_prev_sibling || ctx.impl_as_prev_sibling);
92-
complete_use_tree_keyword(acc, ctx);
9390

9491
let fn_def = match &ctx.function_syntax {
9592
Some(it) => it,
@@ -114,13 +111,51 @@ fn complete_return(
114111

115112
#[cfg(test)]
116113
mod tests {
117-
use crate::completion::{test_utils::do_completion, CompletionItem, CompletionKind};
114+
use crate::{
115+
completion::{
116+
test_utils::{do_completion, do_completion_with_position},
117+
CompletionItem, CompletionKind,
118+
},
119+
CompletionItemKind,
120+
};
118121
use insta::assert_debug_snapshot;
122+
use rustc_hash::FxHashSet;
119123

120124
fn do_keyword_completion(code: &str) -> Vec<CompletionItem> {
121125
do_completion(code, CompletionKind::Keyword)
122126
}
123127

128+
fn assert_completion_keyword(code: &str, keywords: &[(&str, &str)]) {
129+
let (position, completion_items) =
130+
do_completion_with_position(code, CompletionKind::Keyword);
131+
let mut set = FxHashSet::<(String, String)>::default();
132+
for (key, value) in keywords {
133+
set.insert(((*key).to_string(), (*value).to_string()));
134+
}
135+
136+
for item in completion_items {
137+
assert!(item.text_edit().len() == 1);
138+
assert!(item.kind() == Some(CompletionItemKind::Keyword));
139+
let atom = item.text_edit().iter().next().unwrap().clone();
140+
assert!(atom.delete.start() == position.offset);
141+
assert!(atom.delete.end() == position.offset);
142+
let pair = (item.label().to_string(), atom.insert);
143+
assert!(set.contains(&pair));
144+
set.remove(&pair);
145+
}
146+
assert!(set.is_empty());
147+
}
148+
149+
#[test]
150+
fn completes_keywords_in_use_stmt_new_approach() {
151+
assert_completion_keyword(
152+
r"
153+
use <|>
154+
",
155+
&[("crate", "crate::"), ("self", "self"), ("super", "super::")],
156+
);
157+
}
158+
124159
#[test]
125160
fn completes_keywords_in_use_stmt() {
126161
assert_debug_snapshot!(

crates/ra_ide/src/completion/test_utils.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::{
44
completion::{completion_item::CompletionKind, CompletionConfig},
55
mock_analysis::{analysis_and_position, single_file_with_position},
6-
CompletionItem,
6+
CompletionItem, FilePosition,
77
};
88
use hir::Semantics;
99
use ra_syntax::{AstNode, NodeOrToken, SyntaxElement, SyntaxToken};
@@ -12,11 +12,26 @@ pub(crate) fn do_completion(code: &str, kind: CompletionKind) -> Vec<CompletionI
1212
do_completion_with_options(code, kind, &CompletionConfig::default())
1313
}
1414

15+
pub(crate) fn do_completion_with_position(
16+
code: &str,
17+
kind: CompletionKind,
18+
) -> (FilePosition, Vec<CompletionItem>) {
19+
do_completion_with_options_and_position(code, kind, &CompletionConfig::default())
20+
}
21+
1522
pub(crate) fn do_completion_with_options(
1623
code: &str,
1724
kind: CompletionKind,
1825
options: &CompletionConfig,
1926
) -> Vec<CompletionItem> {
27+
do_completion_with_options_and_position(code, kind, options).1
28+
}
29+
30+
pub(crate) fn do_completion_with_options_and_position(
31+
code: &str,
32+
kind: CompletionKind,
33+
options: &CompletionConfig,
34+
) -> (FilePosition, Vec<CompletionItem>) {
2035
let (analysis, position) = if code.contains("//-") {
2136
analysis_and_position(code)
2237
} else {
@@ -27,7 +42,7 @@ pub(crate) fn do_completion_with_options(
2742
let mut kind_completions: Vec<CompletionItem> =
2843
completion_items.into_iter().filter(|c| c.completion_kind == kind).collect();
2944
kind_completions.sort_by_key(|c| c.label().to_owned());
30-
kind_completions
45+
(position, kind_completions)
3146
}
3247

3348
pub(crate) fn check_pattern_is_applicable(code: &str, check: fn(SyntaxElement) -> bool) {

0 commit comments

Comments
 (0)