From d3db700db421d2a505bb3a2d17863573608cc04d Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 6 Jul 2022 19:00:11 +0200 Subject: [PATCH] Fix panic on paste when editing with auto-indent Instead of accepting text as it's input by the user, we will read it out of the edit operation after it gets sanitized by the buffer. --- crates/language/src/buffer.rs | 3 ++- crates/language/src/tests.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 1e244ab4c5630f14660c18e028e3c2cd5723392f..42cca419008b987e13d3338b5983cfb8be0682df 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1233,7 +1233,8 @@ impl Buffer { let inserted_ranges = edits .into_iter() - .filter_map(|(range, new_text)| { + .zip(&edit_operation.as_edit().unwrap().new_text) + .filter_map(|((range, _), new_text)| { let first_newline_ix = new_text.find('\n')?; let new_text_len = new_text.len(); let start = (delta + range.start as isize) as usize + first_newline_ix + 1; diff --git a/crates/language/src/tests.rs b/crates/language/src/tests.rs index a645af3c025e5722cf76c17600611bda1ab7d43a..ba8744624db8a222cf7a3825b15c1605e3903f7d 100644 --- a/crates/language/src/tests.rs +++ b/crates/language/src/tests.rs @@ -22,6 +22,29 @@ fn init_logger() { } } +#[gpui::test] +fn test_line_endings(cx: &mut gpui::MutableAppContext) { + cx.add_model(|cx| { + let mut buffer = + Buffer::new(0, "one\r\ntwo\rthree", cx).with_language(Arc::new(rust_lang()), cx); + assert_eq!(buffer.text(), "one\ntwo\nthree"); + assert_eq!(buffer.line_ending(), LineEnding::Windows); + + buffer.check_invariants(); + buffer.edit_with_autoindent( + [(buffer.len()..buffer.len(), "\r\nfour")], + IndentSize::spaces(2), + cx, + ); + buffer.edit([(0..0, "zero\r\n")], cx); + assert_eq!(buffer.text(), "zero\none\ntwo\nthree\nfour"); + assert_eq!(buffer.line_ending(), LineEnding::Windows); + buffer.check_invariants(); + + buffer + }); +} + #[gpui::test] fn test_select_language() { let registry = LanguageRegistry::test();