Invalidate skipped throttled hint fetch tasks' ranges

Kirill Bulatov created

Change summary

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

Detailed changes

crates/editor/src/inlay_hint_cache.rs 🔗

@@ -208,7 +208,7 @@ impl TasksForRanges {
     fn remove_from_cached_ranges(
         &mut self,
         buffer: &BufferSnapshot,
-        range_to_remove: Range<language::Anchor>,
+        range_to_remove: &Range<language::Anchor>,
     ) {
         self.sorted_ranges = self
             .sorted_ranges
@@ -791,7 +791,7 @@ fn new_update_task(
             INVISIBLE_RANGES_HINTS_REQUEST_DELAY_MILLIS,
         ));
 
-        let mut query_range_failed = |range: Range<language::Anchor>, e: anyhow::Error| {
+        let mut query_range_failed = |range: &Range<language::Anchor>, e: anyhow::Error| {
             log::error!("inlay hint update task for range {range:?} failed: {e:#}");
             editor
                 .update(&mut cx, |editor, _| {
@@ -800,7 +800,7 @@ fn new_update_task(
                         .update_tasks
                         .get_mut(&query.excerpt_id)
                     {
-                        task_ranges.remove_from_cached_ranges(&buffer_snapshot, range);
+                        task_ranges.remove_from_cached_ranges(&buffer_snapshot, &range);
                     }
                 })
                 .ok()
@@ -808,7 +808,7 @@ fn new_update_task(
 
         for (range, result) in visible_range_update_results {
             if let Err(e) = result {
-                query_range_failed(range, e);
+                query_range_failed(&range, e);
             }
         }
 
@@ -828,7 +828,7 @@ fn new_update_task(
         .await;
         for (range, result) in invisible_range_update_results {
             if let Err(e) = result {
-                query_range_failed(range, e);
+                query_range_failed(&range, e);
             }
         }
     })
@@ -876,6 +876,14 @@ async fn fetch_and_update_hints(
                         && !double_visible_range
                             .contains(&fetch_range.end.to_offset(&buffer_snapshot))
                     {
+                        log::trace!("Fetching inlay hints for range {fetch_range_to_log:?} got throttled and fell off the current visible range, skipping.");
+                        if let Some(task_ranges) = editor
+                            .inlay_hint_cache
+                            .update_tasks
+                            .get_mut(&query.excerpt_id)
+                        {
+                            task_ranges.remove_from_cached_ranges(&buffer_snapshot, &fetch_range);
+                        }
                         return None;
                     }
                 }