editor: Fix highlight selection panic (#25141)

smit created

Use the latest selection state for highlighting instead of the state
before debounce.

Release Notes:

- N/A

Change summary

crates/editor/src/editor.rs | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -4782,24 +4782,24 @@ impl Editor {
             self.clear_background_highlights::<SelectedTextHighlight>(cx);
             return;
         }
-        if self.selections.count() != 1 || self.selections.line_mode {
-            self.clear_background_highlights::<SelectedTextHighlight>(cx);
-            return;
-        }
-        let selection = self.selections.newest::<Point>(cx);
-        if selection.is_empty() || selection.start.row != selection.end.row {
-            self.clear_background_highlights::<SelectedTextHighlight>(cx);
-            return;
-        }
         let debounce = EditorSettings::get_global(cx).selection_highlight_debounce;
         self.selection_highlight_task = Some(cx.spawn_in(window, |editor, mut cx| async move {
             cx.background_executor()
                 .timer(Duration::from_millis(debounce))
                 .await;
-            let Some(matches_task) = editor
-                .read_with(&mut cx, |editor, cx| {
+            let Some(Some(matches_task)) = editor
+                .update_in(&mut cx, |editor, _, cx| {
+                    if editor.selections.count() != 1 || editor.selections.line_mode {
+                        editor.clear_background_highlights::<SelectedTextHighlight>(cx);
+                        return None;
+                    }
+                    let selection = editor.selections.newest::<Point>(cx);
+                    if selection.is_empty() || selection.start.row != selection.end.row {
+                        editor.clear_background_highlights::<SelectedTextHighlight>(cx);
+                        return None;
+                    }
                     let buffer = editor.buffer().read(cx).snapshot(cx);
-                    cx.background_spawn(async move {
+                    Some(cx.background_spawn(async move {
                         let mut ranges = Vec::new();
                         let buffer_ranges =
                             vec![buffer.anchor_before(0)..buffer.anchor_after(buffer.len())];
@@ -4837,7 +4837,7 @@ impl Editor {
                             }
                         }
                         ranges
-                    })
+                    }))
                 })
                 .log_err()
             else {