diff options
Diffstat (limited to 'crates/completion')
-rw-r--r-- | crates/completion/src/completions/keyword.rs | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/crates/completion/src/completions/keyword.rs b/crates/completion/src/completions/keyword.rs index 665214895..effc3e4bf 100644 --- a/crates/completion/src/completions/keyword.rs +++ b/crates/completion/src/completions/keyword.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | //! Completes keywords. | 1 | //! Completes keywords. |
2 | 2 | ||
3 | use syntax::{ast, SyntaxKind}; | 3 | use syntax::SyntaxKind; |
4 | use test_utils::mark; | 4 | use test_utils::mark; |
5 | 5 | ||
6 | use crate::{CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions}; | 6 | use crate::{CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions}; |
@@ -143,47 +143,39 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte | |||
143 | Some(it) => it, | 143 | Some(it) => it, |
144 | None => return, | 144 | None => return, |
145 | }; | 145 | }; |
146 | acc.add_all(complete_return(ctx, &fn_def, ctx.can_be_stmt)); | ||
147 | } | ||
148 | |||
149 | fn keyword(ctx: &CompletionContext, kw: &str, snippet: &str) -> CompletionItem { | ||
150 | let res = CompletionItem::new(CompletionKind::Keyword, ctx.source_range(), kw) | ||
151 | .kind(CompletionItemKind::Keyword); | ||
152 | 146 | ||
153 | match ctx.config.snippet_cap { | 147 | add_keyword( |
154 | Some(cap) => res.insert_snippet(cap, snippet), | 148 | ctx, |
155 | _ => res.insert_text(if snippet.contains('$') { kw } else { snippet }), | 149 | acc, |
156 | } | 150 | "return", |
157 | .build() | 151 | match (ctx.can_be_stmt, fn_def.ret_type().is_some()) { |
152 | (true, true) => "return $0;", | ||
153 | (true, false) => "return;", | ||
154 | (false, true) => "return $0", | ||
155 | (false, false) => "return", | ||
156 | }, | ||
157 | ) | ||
158 | } | 158 | } |
159 | 159 | ||
160 | fn add_keyword(ctx: &CompletionContext, acc: &mut Completions, kw: &str, snippet: &str) { | 160 | fn add_keyword(ctx: &CompletionContext, acc: &mut Completions, kw: &str, snippet: &str) { |
161 | acc.add(keyword(ctx, kw, snippet)); | 161 | let builder = CompletionItem::new(CompletionKind::Keyword, ctx.source_range(), kw) |
162 | } | 162 | .kind(CompletionItemKind::Keyword); |
163 | 163 | let builder = match ctx.config.snippet_cap { | |
164 | fn complete_return( | 164 | Some(cap) => builder.insert_snippet(cap, snippet), |
165 | ctx: &CompletionContext, | 165 | None => builder.insert_text(if snippet.contains('$') { kw } else { snippet }), |
166 | fn_def: &ast::Fn, | ||
167 | can_be_stmt: bool, | ||
168 | ) -> Option<CompletionItem> { | ||
169 | let snip = match (can_be_stmt, fn_def.ret_type().is_some()) { | ||
170 | (true, true) => "return $0;", | ||
171 | (true, false) => "return;", | ||
172 | (false, true) => "return $0", | ||
173 | (false, false) => "return", | ||
174 | }; | 166 | }; |
175 | Some(keyword(ctx, "return", snip)) | 167 | acc.add(builder.build()); |
176 | } | 168 | } |
177 | 169 | ||
178 | #[cfg(test)] | 170 | #[cfg(test)] |
179 | mod tests { | 171 | mod tests { |
180 | use expect_test::{expect, Expect}; | 172 | use expect_test::{expect, Expect}; |
173 | use test_utils::mark; | ||
181 | 174 | ||
182 | use crate::{ | 175 | use crate::{ |
183 | test_utils::{check_edit, completion_list}, | 176 | test_utils::{check_edit, completion_list}, |
184 | CompletionKind, | 177 | CompletionKind, |
185 | }; | 178 | }; |
186 | use test_utils::mark; | ||
187 | 179 | ||
188 | fn check(ra_fixture: &str, expect: Expect) { | 180 | fn check(ra_fixture: &str, expect: Expect) { |
189 | let actual = completion_list(ra_fixture, CompletionKind::Keyword); | 181 | let actual = completion_list(ra_fixture, CompletionKind::Keyword); |