From b36d1386a9fb020a8cd6a14e574b3ee1760bb5a1 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Tue, 13 Aug 2024 12:11:57 +0300 Subject: [PATCH] Fix `editor::Cancel` action not inline assistant inputs created for empty selections (#16150) Release Notes: - N/A --- crates/assistant/src/inline_assistant.rs | 38 ++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/crates/assistant/src/inline_assistant.rs b/crates/assistant/src/inline_assistant.rs index 86b7176037..b26abb84f0 100644 --- a/crates/assistant/src/inline_assistant.rs +++ b/crates/assistant/src/inline_assistant.rs @@ -532,17 +532,43 @@ impl InlineAssistant { if editor.selections.count() == 1 { let selection = editor.selections.newest::(cx); let buffer = editor.buffer().read(cx).snapshot(cx); + let mut closest_assist_fallback = None; for assist_id in &editor_assists.assist_ids { let assist = &self.assists[assist_id]; let assist_range = assist.range.to_offset(&buffer); - if assist.decorations.is_some() - && assist_range.contains(&selection.start) - && assist_range.contains(&selection.end) - { - self.focus_assist(*assist_id, cx); - return; + if assist.decorations.is_some() { + if assist_range.contains(&selection.start) + && assist_range.contains(&selection.end) + { + self.focus_assist(*assist_id, cx); + return; + } else { + let distance_from_selection = assist_range + .start + .abs_diff(selection.start) + .min(assist_range.start.abs_diff(selection.end)) + + assist_range + .end + .abs_diff(selection.start) + .min(assist_range.end.abs_diff(selection.end)); + match closest_assist_fallback { + Some((_, old_distance)) => { + if distance_from_selection < old_distance { + closest_assist_fallback = + Some((assist_id, distance_from_selection)); + } + } + None => { + closest_assist_fallback = Some((assist_id, distance_from_selection)) + } + } + } } } + + if let Some((&assist_id, _)) = closest_assist_fallback { + self.focus_assist(assist_id, cx); + } } cx.propagate();