From b3dc31d7c9d2df638637ef263182f8e835d3b82b Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 10 May 2024 10:45:28 +0200 Subject: [PATCH] tasks: Filter out run indicators outside of excerpt bounds instead of using saturating_sub (#11634) This way we'll display run indicators around excerpt boundaries correctly. Release Notes: - N/A --- crates/multi_buffer/src/multi_buffer.rs | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 70343beb5e..ab2ff89141 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/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)