diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-05-27 14:22:26 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-05-27 14:22:26 +0100 |
commit | 94889b6472b6332436235f6074ebc8ae3ac0ef15 (patch) | |
tree | 40bbe4ad323bbeabb99dbc29d6d0a759b32cd134 /crates | |
parent | 59adc7bfb6084e946afbea40351c3f6653c37174 (diff) | |
parent | 846cefa4917dc68a85b7b307be5d1890b83e1e2d (diff) |
Merge #4592
4592: fix textedit range returned for completion when left token is a keyword r=bnjjj a=bnjjj
close #4545
Co-authored-by: Benjamin Coenen <[email protected]>
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 1 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/complete_unqualified_path.rs | 36 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/completion_context.rs | 13 |
3 files changed, 49 insertions, 1 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 8d7937d94..e40aeffbc 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -1363,6 +1363,7 @@ impl HirDisplay for Type { | |||
1363 | } | 1363 | } |
1364 | 1364 | ||
1365 | /// For IDE only | 1365 | /// For IDE only |
1366 | #[derive(Debug)] | ||
1366 | pub enum ScopeDef { | 1367 | pub enum ScopeDef { |
1367 | ModuleDef(ModuleDef), | 1368 | ModuleDef(ModuleDef), |
1368 | MacroDef(MacroDef), | 1369 | MacroDef(MacroDef), |
diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs index db791660a..68032c37e 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs | |||
@@ -298,6 +298,42 @@ mod tests { | |||
298 | } | 298 | } |
299 | 299 | ||
300 | #[test] | 300 | #[test] |
301 | fn completes_bindings_from_for_with_in_prefix() { | ||
302 | mark::check!(completes_bindings_from_for_with_in_prefix); | ||
303 | assert_debug_snapshot!( | ||
304 | do_reference_completion( | ||
305 | r" | ||
306 | fn test() { | ||
307 | for index in &[1, 2, 3] { | ||
308 | let t = in<|> | ||
309 | } | ||
310 | } | ||
311 | " | ||
312 | ), | ||
313 | @r###" | ||
314 | [ | ||
315 | CompletionItem { | ||
316 | label: "index", | ||
317 | source_range: 107..107, | ||
318 | delete: 107..107, | ||
319 | insert: "index", | ||
320 | kind: Binding, | ||
321 | }, | ||
322 | CompletionItem { | ||
323 | label: "test()", | ||
324 | source_range: 107..107, | ||
325 | delete: 107..107, | ||
326 | insert: "test()$0", | ||
327 | kind: Function, | ||
328 | lookup: "test", | ||
329 | detail: "fn test()", | ||
330 | }, | ||
331 | ] | ||
332 | "### | ||
333 | ); | ||
334 | } | ||
335 | |||
336 | #[test] | ||
301 | fn completes_generic_params() { | 337 | fn completes_generic_params() { |
302 | assert_debug_snapshot!( | 338 | assert_debug_snapshot!( |
303 | do_reference_completion( | 339 | do_reference_completion( |
diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index da336973c..c4646b727 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs | |||
@@ -12,6 +12,7 @@ use ra_syntax::{ | |||
12 | use ra_text_edit::Indel; | 12 | use ra_text_edit::Indel; |
13 | 13 | ||
14 | use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition}; | 14 | use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition}; |
15 | use test_utils::mark; | ||
15 | 16 | ||
16 | /// `CompletionContext` is created early during completion to figure out, where | 17 | /// `CompletionContext` is created early during completion to figure out, where |
17 | /// exactly is the cursor, syntax-wise. | 18 | /// exactly is the cursor, syntax-wise. |
@@ -169,7 +170,17 @@ impl<'a> CompletionContext<'a> { | |||
169 | match self.token.kind() { | 170 | match self.token.kind() { |
170 | // workaroud when completion is triggered by trigger characters. | 171 | // workaroud when completion is triggered by trigger characters. |
171 | IDENT => self.original_token.text_range(), | 172 | IDENT => self.original_token.text_range(), |
172 | _ => TextRange::empty(self.offset), | 173 | _ => { |
174 | // If we haven't characters between keyword and our cursor we take the keyword start range to edit | ||
175 | if self.token.kind().is_keyword() | ||
176 | && self.offset == self.original_token.text_range().end() | ||
177 | { | ||
178 | mark::hit!(completes_bindings_from_for_with_in_prefix); | ||
179 | TextRange::empty(self.original_token.text_range().start()) | ||
180 | } else { | ||
181 | TextRange::empty(self.offset) | ||
182 | } | ||
183 | } | ||
173 | } | 184 | } |
174 | } | 185 | } |
175 | 186 | ||