Reuse already running default prettiers

Kirill Bulatov created

Change summary

crates/project/src/project.rs | 93 +++++++++++++++++++++++-------------
1 file changed, 59 insertions(+), 34 deletions(-)

Detailed changes

crates/project/src/project.rs 🔗

@@ -8440,31 +8440,43 @@ impl Project {
                             .await
                         {
                             Ok(None) => {
-                                project.update(&mut cx, |project, _| {
-                                    project
-                                        .prettiers_per_worktree
-                                        .entry(worktree_id)
-                                        .or_default()
-                                        .insert(None)
-                                });
-                                let new_task = project.update(&mut cx, |project, cx| {
-                                    let new_task = start_prettier(
-                                        node,
-                                        DEFAULT_PRETTIER_DIR.clone(),
-                                        Some(worktree_id),
-                                        cx,
-                                    );
-                                    project
-                                        .default_prettier
-                                        .get_or_insert_with(|| DefaultPrettier {
-                                            instance: None,
-                                            #[cfg(not(any(test, feature = "test-support")))]
-                                            installed_plugins: HashSet::default(),
-                                        })
-                                        .instance = Some(new_task.clone());
-                                    new_task
-                                });
-                                return Some((None, new_task));
+                                let started_default_prettier =
+                                    project.update(&mut cx, |project, _| {
+                                        project
+                                            .prettiers_per_worktree
+                                            .entry(worktree_id)
+                                            .or_default()
+                                            .insert(None);
+                                        project.default_prettier.as_ref().and_then(
+                                            |default_prettier| default_prettier.instance.clone(),
+                                        )
+                                    });
+                                match started_default_prettier {
+                                    Some(old_task) => return Some((None, old_task)),
+                                    None => {
+                                        let new_task = project.update(&mut cx, |project, cx| {
+                                            let new_task = start_prettier(
+                                                node,
+                                                DEFAULT_PRETTIER_DIR.clone(),
+                                                Some(worktree_id),
+                                                cx,
+                                            );
+                                            project
+                                                .default_prettier
+                                                .get_or_insert_with(|| DefaultPrettier {
+                                                    instance: None,
+                                                    #[cfg(not(any(
+                                                        test,
+                                                        feature = "test-support"
+                                                    )))]
+                                                    installed_plugins: HashSet::default(),
+                                                })
+                                                .instance = Some(new_task.clone());
+                                            new_task
+                                        });
+                                        return Some((None, new_task));
+                                    }
+                                }
                             }
                             Ok(Some(prettier_dir)) => {
                                 project.update(&mut cx, |project, _| {
@@ -8479,6 +8491,9 @@ impl Project {
                                         project.prettier_instances.get(&prettier_dir).cloned()
                                     })
                                 {
+                                    log::debug!(
+                                        "Found already started prettier in {prettier_dir:?}"
+                                    );
                                     return Some((Some(prettier_dir), existing_prettier));
                                 }
 
@@ -8510,15 +8525,25 @@ impl Project {
                     });
                 }
                 None => {
-                    let new_task = start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), None, cx);
-                    self.default_prettier
-                        .get_or_insert_with(|| DefaultPrettier {
-                            instance: None,
-                            #[cfg(not(any(test, feature = "test-support")))]
-                            installed_plugins: HashSet::default(),
-                        })
-                        .instance = Some(new_task.clone());
-                    return Task::ready(Some((None, new_task)));
+                    let started_default_prettier = self
+                        .default_prettier
+                        .as_ref()
+                        .and_then(|default_prettier| default_prettier.instance.clone());
+                    match started_default_prettier {
+                        Some(old_task) => return Task::ready(Some((None, old_task))),
+                        None => {
+                            let new_task =
+                                start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), None, cx);
+                            self.default_prettier
+                                .get_or_insert_with(|| DefaultPrettier {
+                                    instance: None,
+                                    #[cfg(not(any(test, feature = "test-support")))]
+                                    installed_plugins: HashSet::default(),
+                                })
+                                .instance = Some(new_task.clone());
+                            return Task::ready(Some((None, new_task)));
+                        }
+                    }
                 }
             }
         } else if self.remote_id().is_some() {