From 37e3cc12917109f0324724449c0089ba4eed8d10 Mon Sep 17 00:00:00 2001 From: Julia Date: Wed, 22 Nov 2023 16:26:27 -0500 Subject: [PATCH] zed2(ish) Cancel completion resolution when new list --- crates/editor2/src/editor.rs | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/crates/editor2/src/editor.rs b/crates/editor2/src/editor.rs index fa5f4dfa42975700f0cba6276a276273b2454de9..5c25279270122449434ddc41a9ca8d76f5cf3f1a 100644 --- a/crates/editor2/src/editor.rs +++ b/crates/editor2/src/editor.rs @@ -966,20 +966,22 @@ impl CompletionsMenu { fn pre_resolve_completion_documentation( &self, - project: Option>, - cx: &mut ViewContext, - ) { + _editor: &Editor, + _cx: &mut ViewContext, + ) -> Option> { // todo!("implementation below "); + None } - // ) { + // { // let settings = EditorSettings::get_global(cx); // if !settings.show_completion_documentation { - // return; + // return None; // } - // let Some(project) = project else { - // return; + // let Some(project) = editor.project.clone() else { + // return None; // }; + // let client = project.read(cx).client(); // let language_registry = project.read(cx).languages().clone(); @@ -989,7 +991,7 @@ impl CompletionsMenu { // let completions = self.completions.clone(); // let completion_indices: Vec<_> = self.matches.iter().map(|m| m.candidate_id).collect(); - // cx.spawn(move |this, mut cx| async move { + // Some(cx.spawn(move |this, mut cx| async move { // if is_remote { // let Some(project_id) = project_id else { // log::error!("Remote project without remote_id"); @@ -1051,8 +1053,7 @@ impl CompletionsMenu { // _ = this.update(&mut cx, |_, cx| cx.notify()); // } // } - // }) - // .detach(); + // })) // } fn attempt_resolve_selected_completion_documentation( @@ -3596,7 +3597,8 @@ impl Editor { let id = post_inc(&mut self.next_completion_id); let task = cx.spawn(|this, mut cx| { async move { - let menu = if let Some(completions) = completions.await.log_err() { + let completions = completions.await.log_err(); + let (menu, pre_resolve_task) = if let Some(completions) = completions { let mut menu = CompletionsMenu { id, initial_position: position, @@ -3619,20 +3621,24 @@ impl Editor { }; menu.filter(query.as_deref(), cx.background_executor().clone()) .await; + if menu.matches.is_empty() { - None + (None, None) } else { - _ = this.update(&mut cx, |editor, cx| { - menu.pre_resolve_completion_documentation(editor.project.clone(), cx); - }); - Some(menu) + let pre_resolve_task = this + .update(&mut cx, |editor, cx| { + menu.pre_resolve_completion_documentation(editor, cx) + }) + .ok() + .flatten(); + (Some(menu), pre_resolve_task) } } else { - None + (None, None) }; this.update(&mut cx, |this, cx| { - this.completion_tasks.retain(|(task_id, _)| *task_id > id); + this.completion_tasks.retain(|(task_id, _)| *task_id >= id); let mut context_menu = this.context_menu.write(); match context_menu.as_ref() { @@ -3664,10 +3670,15 @@ impl Editor { } })?; + if let Some(pre_resolve_task) = pre_resolve_task { + pre_resolve_task.await; + } + Ok::<_, anyhow::Error>(()) } .log_err() }); + self.completion_tasks.push((id, task)); }