diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index a7e39ff8b62eb8eafbb3a5ffaa081aa506486025..ed09ffbff2e3d5a556c960b23f26ad763d7de271 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -569,7 +569,9 @@ impl Buffer { .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() { + this.finalize_last_transaction(); + this.apply_diff(diff, cx); + if let Some(transaction) = this.finalize_last_transaction().cloned() { this.did_reload( this.version(), this.as_rope().fingerprint(), @@ -1172,20 +1174,15 @@ impl Buffer { }) } - pub fn apply_diff(&mut self, diff: Diff, cx: &mut ModelContext) -> Option<&Transaction> { - if self.version != diff.base_version { + pub fn apply_diff(&mut self, diff: Diff, cx: &mut ModelContext) -> Option { + if self.version == diff.base_version { + self.apply_non_conflicting_portion_of_diff(diff, cx) + } else { return None; } - - self.finalize_last_transaction(); - self.start_transaction(); - self.text.set_line_ending(diff.line_ending); - self.edit(diff.edits, None, cx); - self.end_transaction(cx)?; - self.finalize_last_transaction() } - pub fn apply_diff_force( + pub fn apply_non_conflicting_portion_of_diff( &mut self, diff: Diff, cx: &mut ModelContext, diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index 9212534959c07db0d5e305c2b722c4b35ea75ff1..c7fc25d793ac0d16d4904a504c38181545775fa4 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -254,7 +254,7 @@ async fn test_normalize_whitespace(cx: &mut gpui::TestAppContext) { let format_diff = format.await; buffer.update(cx, |buffer, cx| { let version_before_format = format_diff.base_version.clone(); - buffer.apply_diff_force(format_diff, cx); + buffer.apply_non_conflicting_portion_of_diff(format_diff, cx); // The outcome depends on the order of concurrent taks. // diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index d238009559c7d602b15d783fc4a0fab147da7507..9ad29691c5bfd4420669b5c0a28b116c8b28df07 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2906,7 +2906,7 @@ impl Project { .await; buffer.update(&mut cx, move |buffer, cx| { buffer.finalize_last_transaction(); - buffer.apply_diff_force(diff, cx) + buffer.apply_non_conflicting_portion_of_diff(diff, cx) }) } else { None