From 0e814a3b5f5c7d034b0249cfb4391d9fcb9d8e42 Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Sun, 24 May 2020 16:47:35 +0200 Subject: [PATCH 1/2] fix textedit range returned for completion when left token is a keyword #4545 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_hir/src/code_model.rs | 1 + .../completion/complete_unqualified_path.rs | 35 +++++++++++++++++++ .../src/completion/completion_context.rs | 11 +++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 840cfdfc82..7c015aa98a 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 { } /// For IDE only +#[derive(Debug)] pub enum ScopeDef { ModuleDef(ModuleDef), 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 db791660a1..417a920010 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs @@ -297,6 +297,41 @@ mod tests { ); } + #[test] + fn completes_bindings_from_for_with_in_prefix() { + assert_debug_snapshot!( + do_reference_completion( + r" + fn test() { + for index in &[1, 2, 3] { + let t = in<|> + } + } + " + ), + @r###" + [ + CompletionItem { + label: "index", + source_range: 107..107, + delete: 107..107, + insert: "index", + kind: Binding, + }, + CompletionItem { + label: "test()", + source_range: 107..107, + delete: 107..107, + insert: "test()$0", + kind: Function, + lookup: "test", + detail: "fn test()", + }, + ] + "### + ); + } + #[test] fn completes_generic_params() { assert_debug_snapshot!( diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index da336973c1..e8bf07d6eb 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs @@ -169,7 +169,16 @@ impl<'a> CompletionContext<'a> { match self.token.kind() { // workaroud when completion is triggered by trigger characters. IDENT => self.original_token.text_range(), - _ => TextRange::empty(self.offset), + _ => { + // If we haven't characters between keyword and our cursor we take the keyword start range to edit + if self.token.kind().is_keyword() + && self.offset == self.original_token.text_range().end() + { + TextRange::empty(self.original_token.text_range().start()) + } else { + TextRange::empty(self.offset) + } + } } } From 846cefa4917dc68a85b7b307be5d1890b83e1e2d Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Wed, 27 May 2020 15:15:19 +0200 Subject: [PATCH 2/2] fix textedit range returned for completion when left token is a keyword Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/completion/complete_unqualified_path.rs | 1 + crates/ra_ide/src/completion/completion_context.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs index 417a920010..68032c37ed 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs @@ -299,6 +299,7 @@ mod tests { #[test] fn completes_bindings_from_for_with_in_prefix() { + mark::check!(completes_bindings_from_for_with_in_prefix); assert_debug_snapshot!( do_reference_completion( r" diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index e8bf07d6eb..c4646b727c 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::{ use ra_text_edit::Indel; use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition}; +use test_utils::mark; /// `CompletionContext` is created early during completion to figure out, where /// exactly is the cursor, syntax-wise. @@ -174,6 +175,7 @@ impl<'a> CompletionContext<'a> { if self.token.kind().is_keyword() && self.offset == self.original_token.text_range().end() { + mark::hit!(completes_bindings_from_for_with_in_prefix); TextRange::empty(self.original_token.text_range().start()) } else { TextRange::empty(self.offset)