tasks: Filter out run indicators outside of excerpt bounds instead of using saturating_sub (#11634)

Piotr Osiewicz created

This way we'll display run indicators around excerpt boundaries
correctly.

Release Notes:

- N/A

Change summary

crates/multi_buffer/src/multi_buffer.rs | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)

Detailed changes

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -3182,16 +3182,24 @@ impl MultiBufferSnapshot {
                 excerpt
                     .buffer
                     .runnable_ranges(excerpt.range.context.clone())
-                    .map(move |mut runnable| {
+                    .filter_map(move |mut runnable| {
                         // Re-base onto the excerpts coordinates in the multibuffer
-                        runnable.run_range.start = excerpt_offset
-                            + runnable
-                                .run_range
-                                .start
-                                .saturating_sub(excerpt_buffer_start);
-                        runnable.run_range.end = excerpt_offset
-                            + runnable.run_range.end.saturating_sub(excerpt_buffer_start);
-                        runnable
+                        //
+                        // The node matching our runnables query might partially overlap with
+                        // the provided range. If the run indicator is outside of excerpt bounds, do not actually show it.
+                        if runnable.run_range.start < excerpt_buffer_start {
+                            return None;
+                        }
+                        if language::ToPoint::to_point(&runnable.run_range.end, &excerpt.buffer).row
+                            > excerpt.max_buffer_row
+                        {
+                            return None;
+                        }
+                        runnable.run_range.start =
+                            excerpt_offset + runnable.run_range.start - excerpt_buffer_start;
+                        runnable.run_range.end =
+                            excerpt_offset + runnable.run_range.end - excerpt_buffer_start;
+                        Some(runnable)
                     })
                     .skip_while(move |runnable| runnable.run_range.end < range.start)
                     .take_while(move |runnable| runnable.run_range.start < range.end)