Clip diagnostic range before and during empty range expansion

Julia and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <max@zed.dev>

Change summary

crates/language/src/buffer_tests.rs   |  2 +-
crates/language/src/diagnostic_set.rs |  4 ++--
crates/project/src/project.rs         | 11 +++++++----
3 files changed, 10 insertions(+), 7 deletions(-)

Detailed changes

crates/language/src/buffer_tests.rs 🔗

@@ -1337,7 +1337,7 @@ fn test_random_collaboration(cx: &mut MutableAppContext, mut rng: StdRng) {
                         (0..entry_count).map(|_| {
                             let range = buffer.random_byte_range(0, &mut rng);
                             let range = range.to_point_utf16(buffer);
-                            let range = Unclipped(range.start)..Unclipped(range.end);
+                            let range = range.start..range.end;
                             DiagnosticEntry {
                                 range,
                                 diagnostic: Diagnostic {

crates/language/src/diagnostic_set.rs 🔗

@@ -6,7 +6,7 @@ use std::{
     ops::Range,
 };
 use sum_tree::{self, Bias, SumTree};
-use text::{Anchor, FromAnchor, PointUtf16, ToOffset, Unclipped};
+use text::{Anchor, FromAnchor, PointUtf16, ToOffset};
 
 #[derive(Clone, Debug, Default)]
 pub struct DiagnosticSet {
@@ -63,7 +63,7 @@ impl DiagnosticSet {
 
     pub fn new<I>(iter: I, buffer: &text::BufferSnapshot) -> Self
     where
-        I: IntoIterator<Item = DiagnosticEntry<Unclipped<PointUtf16>>>,
+        I: IntoIterator<Item = DiagnosticEntry<PointUtf16>>,
     {
         let mut entries = iter.into_iter().collect::<Vec<_>>();
         entries.sort_unstable_by_key(|entry| (entry.range.start, Reverse(entry.range.end)));

crates/project/src/project.rs 🔗

@@ -2677,14 +2677,17 @@ impl Project {
                 end = entry.range.end;
             }
 
-            let mut range = start..end;
+            let mut range = snapshot.clip_point_utf16(start, Bias::Left)
+                ..snapshot.clip_point_utf16(end, Bias::Right);
 
             // Expand empty ranges by one codepoint
             if range.start == range.end {
                 // This will be go to the next boundary when being clipped
-                range.end.0.column += 1;
-                if range.start == range.end && range.end.0.column > 0 {
-                    range.start.0.column -= 1;
+                range.end.column += 1;
+                range.end = snapshot.clip_point_utf16(Unclipped(range.end), Bias::Right);
+                if range.start == range.end && range.end.column > 0 {
+                    range.start.column -= 1;
+                    range.end = snapshot.clip_point_utf16(Unclipped(range.end), Bias::Left);
                 }
             }