From d80ecb6f98e0ce3f842198d4066b868c05cdde3e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 4 Jul 2022 17:40:35 +0200 Subject: [PATCH] Ignore carriage returns when reloading buffer --- crates/language/src/buffer.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 226291722c1f667eabca1b051cdf6903e06bafef..aa3b86be677b98e9f712d61a5cae30d577cc82a8 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -554,7 +554,7 @@ impl Buffer { }) { let new_text = new_text.await?; let diff = this - .read_with(&cx, |this, cx| this.diff(new_text.into(), cx)) + .read_with(&cx, |this, cx| this.diff(new_text, cx)) .await; this.update(&mut cx, |this, cx| { if let Some(transaction) = this.apply_diff(diff, cx).cloned() { @@ -968,18 +968,19 @@ impl Buffer { } } - pub(crate) fn diff(&self, new_text: Arc, cx: &AppContext) -> Task { - // TODO: it would be nice to not allocate here. - let old_text = self.text(); + pub(crate) fn diff(&self, new_text: String, cx: &AppContext) -> Task { + let old_text = self.as_rope().clone(); let base_version = self.version(); cx.background().spawn(async move { - let changes = TextDiff::from_lines(old_text.as_str(), new_text.as_ref()) + let old_text = old_text.to_string(); + let new_text = new_text.replace("\r\n", "\n").replace('\r', "\n"); + let changes = TextDiff::from_lines(old_text.as_str(), new_text.as_str()) .iter_all_changes() .map(|c| (c.tag(), c.value().len())) .collect::>(); Diff { base_version, - new_text, + new_text: new_text.into(), changes, start_offset: 0, }