diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-05-03 10:48:44 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-05-03 10:48:44 +0100 |
commit | 76c2f4ef49d8fe89c1199899f9fe6289ddd95b6b (patch) | |
tree | 06be8f61590fdb76aeb9d557a10f913ef65f4f7b | |
parent | 682c079043656a55775eff33d806da517542f9eb (diff) | |
parent | 074d1ac2f7b3e8a6d4088983ac63235f71d3e6a5 (diff) |
Merge #4278
4278: Log panics in apply_document_changes r=matklad a=lnicola
This doesn't necessarily help (because of https://github.com/rust-analyzer/rust-analyzer/issues/4263#issuecomment-623078531), but maybe we could leave it in there for a while in case it catches something.
Co-authored-by: Laurențiu Nicola <[email protected]>
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 3bc2e0a46..401fae755 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -666,6 +666,10 @@ fn apply_document_changes( | |||
666 | mut line_index: Cow<'_, LineIndex>, | 666 | mut line_index: Cow<'_, LineIndex>, |
667 | content_changes: Vec<TextDocumentContentChangeEvent>, | 667 | content_changes: Vec<TextDocumentContentChangeEvent>, |
668 | ) { | 668 | ) { |
669 | // Remove when https://github.com/rust-analyzer/rust-analyzer/issues/4263 is fixed. | ||
670 | let backup_text = old_text.clone(); | ||
671 | let backup_changes = content_changes.clone(); | ||
672 | |||
669 | // The changes we got must be applied sequentially, but can cross lines so we | 673 | // The changes we got must be applied sequentially, but can cross lines so we |
670 | // have to keep our line index updated. | 674 | // have to keep our line index updated. |
671 | // Some clients (e.g. Code) sort the ranges in reverse. As an optimization, we | 675 | // Some clients (e.g. Code) sort the ranges in reverse. As an optimization, we |
@@ -693,7 +697,19 @@ fn apply_document_changes( | |||
693 | } | 697 | } |
694 | index_valid = IndexValid::UpToLine(range.start.line); | 698 | index_valid = IndexValid::UpToLine(range.start.line); |
695 | let range = range.conv_with(&line_index); | 699 | let range = range.conv_with(&line_index); |
696 | old_text.replace_range(Range::<usize>::from(range), &change.text); | 700 | let mut text = old_text.to_owned(); |
701 | match std::panic::catch_unwind(move || { | ||
702 | text.replace_range(Range::<usize>::from(range), &change.text); | ||
703 | text | ||
704 | }) { | ||
705 | Ok(t) => *old_text = t, | ||
706 | Err(e) => { | ||
707 | eprintln!("Bug in incremental text synchronization. Please report the following output on https://github.com/rust-analyzer/rust-analyzer/issues/4263"); | ||
708 | dbg!(&backup_text); | ||
709 | dbg!(&backup_changes); | ||
710 | std::panic::resume_unwind(e); | ||
711 | } | ||
712 | } | ||
697 | } | 713 | } |
698 | None => { | 714 | None => { |
699 | *old_text = change.text; | 715 | *old_text = change.text; |