Fix diff base text not being syntax-highlighted (#46001)

Cole Miller created

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)

Change summary

crates/buffer_diff/src/buffer_diff.rs | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)

Detailed changes

crates/buffer_diff/src/buffer_diff.rs 🔗

@@ -1293,13 +1293,28 @@ impl BufferDiff {
         language_registry: Option<Arc<LanguageRegistry>>,
         cx: &mut Context<Self>,
     ) {
-        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(