From 194618fee5f34ce81cb8f9793105f2d7b62c02d1 Mon Sep 17 00:00:00 2001 From: Pascal Kuthe Date: Mon, 8 Jan 2024 22:14:04 +0100 Subject: [PATCH] don't automatically dismiss zero width diagnostics Normal diagnostics can be removed when all the text they cover has been removed. This is not the case for zero width diagnostics as these are not attached to any particular text. These diagnostics can not be automatically dismissed and must be mapped as a point instead of as a range to avoid that. --- helix-view/src/document.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index af950a3fc283..51668ab169ff 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -1222,18 +1222,23 @@ impl Document { }; (&mut diagnostic.range.start, assoc) })); - changes.update_positions(self.diagnostics.iter_mut().map(|diagnostic| { + changes.update_positions(self.diagnostics.iter_mut().filter_map(|diagnostic| { + if diagnostic.zero_width { + // for zero width diagnostics treat the diagnostic as a point + // rather than a range + return None; + } let assoc = if diagnostic.ends_at_word { Assoc::AfterWord } else { Assoc::Before }; - (&mut diagnostic.range.end, assoc) + Some((&mut diagnostic.range.end, assoc)) })); self.diagnostics.retain_mut(|diagnostic| { - if diagnostic.range.start > diagnostic.range.end - || (!diagnostic.zero_width && diagnostic.range.start == diagnostic.range.end) - { + if diagnostic.zero_width { + diagnostic.range.end = diagnostic.range.start + } else if diagnostic.range.start >= diagnostic.range.end { return false; } diagnostic.line = self.text.char_to_line(diagnostic.range.start);