From 21eb233a387f5b622d47f6db6bee75aed35f07e3 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Sat, 3 Jan 2026 18:38:10 -0500 Subject: [PATCH] Fix diff base text not being syntax-highlighted (#46001) Regressed in #44838 - Wait to emit `LanguageChanged` from `BufferDiff` until the base text has finished (re)parsing - Set the language registry on the base text buffer before setting the language, to ensure that language inclusions are correctly parsed Release Notes: - N/A (nightly only) --- crates/buffer_diff/src/buffer_diff.rs | 29 ++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/crates/buffer_diff/src/buffer_diff.rs b/crates/buffer_diff/src/buffer_diff.rs index 75abab174128f6e3ed678404fd095387d68f4119..40725340962b12f886fbd169536121dba03f4b12 100644 --- a/crates/buffer_diff/src/buffer_diff.rs +++ b/crates/buffer_diff/src/buffer_diff.rs @@ -1293,13 +1293,28 @@ impl BufferDiff { language_registry: Option>, cx: &mut Context, ) { - self.inner.base_text.update(cx, |base_text, cx| { - base_text.set_language(language, cx); - if let Some(language_registry) = language_registry { - base_text.set_language_registry(language_registry); - } - }); - cx.emit(BufferDiffEvent::LanguageChanged); + let base_text = self.inner.base_text.downgrade(); + cx.spawn(async move |this, cx| { + let fut = base_text + .update(cx, |base_text, cx| { + if let Some(language_registry) = language_registry { + base_text.set_language_registry(language_registry); + } + base_text.set_language(language, cx); + base_text.parsing_idle() + }) + .ok()?; + + fut.await; + + this.update(cx, |_, cx| { + cx.emit(BufferDiffEvent::LanguageChanged); + }) + .ok()?; + + Some(()) + }) + .detach(); } pub fn set_snapshot(