Add caching of parsed completion documentation markdown to reduce flicker when selecting (#31546)

Related to #31460 and #28635.

Release Notes:

- Fixed redraw delay of documentation from language server completions
and added caching to reduce flicker when using arrow keys to change
selection.
This commit is contained in:
Michael Sloan 2025-05-27 17:12:38 -06:00 committed by GitHub
parent 31d908fc74
commit 506beafe10
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 300 additions and 95 deletions

View file

@ -4987,14 +4987,12 @@ impl Editor {
(buffer_position..buffer_position, None)
};
let completion_settings = language_settings(
buffer_snapshot
.language_at(buffer_position)
.map(|language| language.name()),
buffer_snapshot.file(),
cx,
)
.completions;
let language = buffer_snapshot
.language_at(buffer_position)
.map(|language| language.name());
let completion_settings =
language_settings(language.clone(), buffer_snapshot.file(), cx).completions;
// The document can be large, so stay in reasonable bounds when searching for words,
// otherwise completion pop-up might be slow to appear.
@ -5106,16 +5104,26 @@ impl Editor {
let menu = if completions.is_empty() {
None
} else {
let mut menu = CompletionsMenu::new(
id,
sort_completions,
show_completion_documentation,
ignore_completion_provider,
position,
buffer.clone(),
completions.into(),
snippet_sort_order,
);
let mut menu = editor.update(cx, |editor, cx| {
let languages = editor
.workspace
.as_ref()
.and_then(|(workspace, _)| workspace.upgrade())
.map(|workspace| workspace.read(cx).app_state().languages.clone());
CompletionsMenu::new(
id,
sort_completions,
show_completion_documentation,
ignore_completion_provider,
position,
buffer.clone(),
completions.into(),
snippet_sort_order,
languages,
language,
cx,
)
})?;
menu.filter(
if filter_completions {
@ -5190,6 +5198,22 @@ impl Editor {
}
}
pub fn with_completions_menu_matching_id<R>(
&self,
id: CompletionId,
on_absent: impl FnOnce() -> R,
on_match: impl FnOnce(&mut CompletionsMenu) -> R,
) -> R {
let mut context_menu = self.context_menu.borrow_mut();
let Some(CodeContextMenu::Completions(completions_menu)) = &mut *context_menu else {
return on_absent();
};
if completions_menu.id != id {
return on_absent();
}
on_match(completions_menu)
}
pub fn confirm_completion(
&mut self,
action: &ConfirmCompletion,
@ -8686,7 +8710,7 @@ impl Editor {
) -> Option<AnyElement> {
self.context_menu.borrow_mut().as_mut().and_then(|menu| {
if menu.visible() {
menu.render_aside(self, max_size, window, cx)
menu.render_aside(max_size, window, cx)
} else {
None
}