mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
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 <5719034+bnjjj@users.noreply.github.com>
This commit is contained in:
commit
94889b6472
3 changed files with 49 additions and 1 deletions
|
@ -1363,6 +1363,7 @@ impl HirDisplay for Type {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For IDE only
|
/// For IDE only
|
||||||
|
#[derive(Debug)]
|
||||||
pub enum ScopeDef {
|
pub enum ScopeDef {
|
||||||
ModuleDef(ModuleDef),
|
ModuleDef(ModuleDef),
|
||||||
MacroDef(MacroDef),
|
MacroDef(MacroDef),
|
||||||
|
|
|
@ -297,6 +297,42 @@ 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"
|
||||||
|
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]
|
#[test]
|
||||||
fn completes_generic_params() {
|
fn completes_generic_params() {
|
||||||
assert_debug_snapshot!(
|
assert_debug_snapshot!(
|
||||||
|
|
|
@ -12,6 +12,7 @@ use ra_syntax::{
|
||||||
use ra_text_edit::Indel;
|
use ra_text_edit::Indel;
|
||||||
|
|
||||||
use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition};
|
use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition};
|
||||||
|
use test_utils::mark;
|
||||||
|
|
||||||
/// `CompletionContext` is created early during completion to figure out, where
|
/// `CompletionContext` is created early during completion to figure out, where
|
||||||
/// exactly is the cursor, syntax-wise.
|
/// exactly is the cursor, syntax-wise.
|
||||||
|
@ -169,7 +170,17 @@ impl<'a> CompletionContext<'a> {
|
||||||
match self.token.kind() {
|
match self.token.kind() {
|
||||||
// workaroud when completion is triggered by trigger characters.
|
// workaroud when completion is triggered by trigger characters.
|
||||||
IDENT => self.original_token.text_range(),
|
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()
|
||||||
|
{
|
||||||
|
mark::hit!(completes_bindings_from_for_with_in_prefix);
|
||||||
|
TextRange::empty(self.original_token.text_range().start())
|
||||||
|
} else {
|
||||||
|
TextRange::empty(self.offset)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue