Inline MultiBuffer::format

Max Brunsfeld created

Put all the logic in Editor. Add an `all_buffers` method so the editor can
format all of the buffers by itself.

Change summary

crates/editor/src/items.rs        | 20 +++++++++++++-------
crates/editor/src/multi_buffer.rs | 24 ++++--------------------
2 files changed, 17 insertions(+), 27 deletions(-)

Detailed changes

crates/editor/src/items.rs 🔗

@@ -11,7 +11,6 @@ use std::path::PathBuf;
 use std::rc::Rc;
 use std::{cell::RefCell, fmt::Write};
 use text::{Point, Selection};
-use util::TryFutureExt;
 use workspace::{
     ItemHandle, ItemNavHistory, ItemView, ItemViewHandle, NavHistory, PathOpener, Settings,
     StatusItemView, WeakItemHandle, Workspace,
@@ -226,14 +225,21 @@ impl ItemView for Editor {
         cx: &mut ViewContext<Self>,
     ) -> Task<Result<()>> {
         let buffer = self.buffer().clone();
-        cx.spawn(|editor, mut cx| async move {
-            buffer
-                .update(&mut cx, |buffer, cx| buffer.format(project, cx).log_err())
-                .await;
-            editor.update(&mut cx, |editor, cx| {
+        let buffers = buffer.read(cx).all_buffers();
+        let transaction = project.update(cx, |project, cx| project.format(buffers, true, cx));
+        cx.spawn(|this, mut cx| async move {
+            let transaction = transaction.await?;
+            this.update(&mut cx, |editor, cx| {
                 editor.request_autoscroll(Autoscroll::Fit, cx)
             });
-            buffer.update(&mut cx, |buffer, cx| buffer.save(cx)).await?;
+            buffer
+                .update(&mut cx, |buffer, cx| {
+                    if !buffer.is_singleton() {
+                        buffer.push_transaction(&transaction.0);
+                    }
+                    buffer.save(cx)
+                })
+                .await?;
             Ok(())
         })
     }

crates/editor/src/multi_buffer.rs 🔗

@@ -3,14 +3,13 @@ mod anchor;
 pub use anchor::{Anchor, AnchorRangeExt};
 use anyhow::Result;
 use clock::ReplicaId;
-use collections::{Bound, HashMap};
+use collections::{Bound, HashMap, HashSet};
 use gpui::{AppContext, Entity, ModelContext, ModelHandle, Task};
 pub use language::Completion;
 use language::{
     Buffer, BufferChunks, BufferSnapshot, Chunk, DiagnosticEntry, Event, File, Language, Outline,
     OutlineItem, Selection, ToOffset as _, ToPoint as _, ToPointUtf16 as _, TransactionId,
 };
-use project::Project;
 use std::{
     cell::{Ref, RefCell},
     cmp, fmt, io,
@@ -931,27 +930,12 @@ impl MultiBuffer {
         cx.emit(event.clone());
     }
 
-    pub fn format(
-        &mut self,
-        project: ModelHandle<Project>,
-        cx: &mut ModelContext<Self>,
-    ) -> Task<Result<()>> {
-        let buffers = self
-            .buffers
+    pub fn all_buffers(&self) -> HashSet<ModelHandle<Buffer>> {
+        self.buffers
             .borrow()
             .values()
             .map(|state| state.buffer.clone())
-            .collect();
-        let transaction = project.update(cx, |project, cx| project.format(buffers, true, cx));
-        cx.spawn(|this, mut cx| async move {
-            let transaction = transaction.await?;
-            this.update(&mut cx, |this, _| {
-                if !this.singleton {
-                    this.push_transaction(&transaction.0);
-                }
-            });
-            Ok(())
-        })
+            .collect()
     }
 
     pub fn save(&mut self, cx: &mut ModelContext<Self>) -> Task<Result<()>> {