Fix bug where prior LSP completions can be displayed after trigger char (#32927)
Bug in #31872 Closes #32774 Release Notes: - Fixed a bug in LSP completions caching where prior completions may be used when they should not, after typing a trigger char like `.`
This commit is contained in:
parent
70aab39e4f
commit
d8eb341f9b
1 changed files with 31 additions and 17 deletions
|
@ -5266,6 +5266,37 @@ impl Editor {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_or(true, |provider| provider.filter_completions());
|
.map_or(true, |provider| provider.filter_completions());
|
||||||
|
|
||||||
|
let trigger_kind = match trigger {
|
||||||
|
Some(trigger) if buffer.read(cx).completion_triggers().contains(trigger) => {
|
||||||
|
CompletionTriggerKind::TRIGGER_CHARACTER
|
||||||
|
}
|
||||||
|
_ => CompletionTriggerKind::INVOKED,
|
||||||
|
};
|
||||||
|
let completion_context = CompletionContext {
|
||||||
|
trigger_character: trigger.and_then(|trigger| {
|
||||||
|
if trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER {
|
||||||
|
Some(String::from(trigger))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
trigger_kind,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Hide the current completions menu when a trigger char is typed. Without this, cached
|
||||||
|
// completions from before the trigger char may be reused (#32774). Snippet choices could
|
||||||
|
// involve trigger chars, so this is skipped in that case.
|
||||||
|
if trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER && self.snippet_stack.is_empty()
|
||||||
|
{
|
||||||
|
let menu_is_open = matches!(
|
||||||
|
self.context_menu.borrow().as_ref(),
|
||||||
|
Some(CodeContextMenu::Completions(_))
|
||||||
|
);
|
||||||
|
if menu_is_open {
|
||||||
|
self.hide_context_menu(window, cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(CodeContextMenu::Completions(menu)) = self.context_menu.borrow_mut().as_mut() {
|
if let Some(CodeContextMenu::Completions(menu)) = self.context_menu.borrow_mut().as_mut() {
|
||||||
if filter_completions {
|
if filter_completions {
|
||||||
menu.filter(query.clone(), provider.clone(), window, cx);
|
menu.filter(query.clone(), provider.clone(), window, cx);
|
||||||
|
@ -5296,23 +5327,6 @@ impl Editor {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let trigger_kind = match trigger {
|
|
||||||
Some(trigger) if buffer.read(cx).completion_triggers().contains(trigger) => {
|
|
||||||
CompletionTriggerKind::TRIGGER_CHARACTER
|
|
||||||
}
|
|
||||||
_ => CompletionTriggerKind::INVOKED,
|
|
||||||
};
|
|
||||||
let completion_context = CompletionContext {
|
|
||||||
trigger_character: trigger.and_then(|trigger| {
|
|
||||||
if trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER {
|
|
||||||
Some(String::from(trigger))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
trigger_kind,
|
|
||||||
};
|
|
||||||
|
|
||||||
let (word_replace_range, word_to_exclude) = if let (word_range, Some(CharKind::Word)) =
|
let (word_replace_range, word_to_exclude) = if let (word_range, Some(CharKind::Word)) =
|
||||||
buffer_snapshot.surrounding_word(buffer_position)
|
buffer_snapshot.surrounding_word(buffer_position)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue