From 32a442d5229f58204df365da6c33796b03179474 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Tue, 21 Oct 2025 00:43:33 +0300 Subject: [PATCH] Fix inlay hint cleanup on excerpts removal (#40738) A cherry-pick of https://github.com/zed-industries/zed/pull/40183/commits/f5188d55fbcbb3856038967bce8e824ddb42bdba This fixes a hard-to-reproduce crash caused excerpts removal not updating previous snapshot data after corresponding inlay data was removed. Same branch has a test: https://github.com/zed-industries/zed/pull/40183/commits/8783a9eb4fbc60e3fbe0654c2d330bddfaa7ef0a that does not fail on `main` due to different way inlays are queried, it will be merged later. Release Notes: - N/A --- crates/editor/src/display_map.rs | 8 ++++++-- crates/editor/src/editor.rs | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index b3d642f60ea591fcf8b1987c723b4ba025dc110a..aad62e0debd366a968a34e5d7b937b75f6272c0d 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -594,7 +594,11 @@ impl DisplayMap { self.block_map.read(snapshot, edits); } - pub fn remove_inlays_for_excerpts(&mut self, excerpts_removed: &[ExcerptId]) { + pub fn remove_inlays_for_excerpts( + &mut self, + excerpts_removed: &[ExcerptId], + cx: &mut Context, + ) { let to_remove = self .inlay_map .current_inlays() @@ -606,7 +610,7 @@ impl DisplayMap { } }) .collect::>(); - self.inlay_map.splice(&to_remove, Vec::new()); + self.splice_inlays(&to_remove, Vec::new(), cx); } fn tab_size(buffer: &Entity, cx: &App) -> NonZeroU32 { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 20ebff811d544d0261e90c43336e569e9a5700ef..6923e5ca5bcbc02a1e2f857942afe97a650dd5cf 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -5298,8 +5298,8 @@ impl Editor { { self.splice_inlays(&to_remove, to_insert, cx); } - self.display_map.update(cx, |display_map, _| { - display_map.remove_inlays_for_excerpts(&excerpts_removed) + self.display_map.update(cx, |display_map, cx| { + display_map.remove_inlays_for_excerpts(&excerpts_removed, cx) }); return; }