Clip invalid edits from LSP instead of reporting an error
Antonio Scandurra
created
This fixes an issue with the Go language server, which reports invalid
formatting ranges when there's a missing newline at the end of the file.
Specifically, if the buffer is `N` lines long, it will try to insert the
newline at `Point(N + 1, 0)`.
I confirmed the behavior is the same in VS Code, and they indeed clip the
LSP ranges as well.
@@ -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.