Merge pull request #1412 from zed-industries/fix-go-formatting

Antonio Scandurra created

Clip invalid edits from LSP instead of reporting an error

Change summary

crates/project/src/project.rs       | 10 ++++------
crates/project/src/project_tests.rs |  4 ++--
2 files changed, 6 insertions(+), 8 deletions(-)

Detailed changes

crates/project/src/project.rs 🔗

@@ -5764,6 +5764,10 @@ impl Project {
             let mut lsp_edits = lsp_edits.into_iter().peekable();
             let mut edits = Vec::new();
             while let Some((mut range, mut new_text)) = lsp_edits.next() {
+                // Clip invalid ranges provided by the language server.
+                range.start = snapshot.clip_point_utf16(range.start, Bias::Left);
+                range.end = snapshot.clip_point_utf16(range.end, Bias::Left);
+
                 // Combine any LSP edits that are adjacent.
                 //
                 // Also, combine LSP edits that are separated from each other by only
@@ -5791,12 +5795,6 @@ impl Project {
                     lsp_edits.next();
                 }
 
-                if snapshot.clip_point_utf16(range.start, Bias::Left) != range.start
-                    || snapshot.clip_point_utf16(range.end, Bias::Left) != range.end
-                {
-                    return Err(anyhow!("invalid edits received from language server"));
-                }
-
                 // For multiline edits, perform a diff of the old and new text so that
                 // we can identify the changes more precisely, preserving the locations
                 // of any anchors positioned in the unchanged regions.

crates/project/src/project_tests.rs 🔗

@@ -1565,7 +1565,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) {
         .unwrap();
 
     // Simulate the language server sending us edits in a non-ordered fashion,
-    // with ranges sometimes being inverted.
+    // with ranges sometimes being inverted or pointing to invalid locations.
     let edits = project
         .update(cx, |project, cx| {
             project.edits_from_lsp(
@@ -1580,7 +1580,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) {
                         new_text: "a::{b, c}".into(),
                     },
                     lsp::TextEdit {
-                        range: lsp::Range::new(lsp::Position::new(1, 0), lsp::Position::new(7, 0)),
+                        range: lsp::Range::new(lsp::Position::new(1, 0), lsp::Position::new(99, 0)),
                         new_text: "".into(),
                     },
                     lsp::TextEdit {