Always write prettier server file

Kirill Bulatov created

Change summary

crates/project/src/prettier_support.rs | 92 +++++++++++++++------------
1 file changed, 50 insertions(+), 42 deletions(-)

Detailed changes

crates/project/src/prettier_support.rs 🔗

@@ -193,51 +193,53 @@ fn start_default_prettier(
 ) -> Task<anyhow::Result<PrettierTask>> {
     cx.spawn(|project, mut cx| async move {
         loop {
-            let mut install_attempt = 0;
             let installation_process = project.update(&mut cx, |project, _| {
                 match &project.default_prettier.prettier {
                     PrettierInstallation::NotInstalled {
                         installation_process,
-                        attempts
-                    } => {
-                        install_attempt = *attempts;
-                        ControlFlow::Continue(installation_process.clone())},
+                        ..
+                    } => ControlFlow::Continue(installation_process.clone()),
                     PrettierInstallation::Installed(default_prettier) => {
                         ControlFlow::Break(default_prettier.clone())
                     }
                 }
             });
-            install_attempt += 1;
-
             match installation_process {
-                ControlFlow::Continue(installation_process) => {
-                    if let Some(installation_process) = installation_process.clone() {
-                        if let Err(e) = installation_process.await {
-                            anyhow::bail!("Cannot start default prettier due to its installation failure: {e:#}");
-                        }
+                ControlFlow::Continue(None) => {
+                    anyhow::bail!("Default prettier is not installed and cannot be started")
+                }
+                ControlFlow::Continue(Some(installation_process)) => {
+                    if let Err(e) = installation_process.await {
+                        anyhow::bail!(
+                            "Cannot start default prettier due to its installation failure: {e:#}"
+                        );
                     }
                     let new_default_prettier = project.update(&mut cx, |project, cx| {
                         let new_default_prettier =
                             start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), worktree_id, cx);
                         project.default_prettier.prettier =
-                            PrettierInstallation::Installed(PrettierInstance { attempt: install_attempt, prettier: Some(new_default_prettier.clone()) });
+                            PrettierInstallation::Installed(PrettierInstance {
+                                attempt: 0,
+                                prettier: Some(new_default_prettier.clone()),
+                            });
                         new_default_prettier
                     });
                     return Ok(new_default_prettier);
                 }
-                ControlFlow::Break(instance) => {
-                    match instance.prettier {
-                        Some(instance) => return Ok(instance),
-                        None => {
-                            let new_default_prettier = project.update(&mut cx, |project, cx| {
-                                let new_default_prettier =
-                                    start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), worktree_id, cx);
-                                project.default_prettier.prettier =
-                                    PrettierInstallation::Installed(PrettierInstance { attempt: instance.attempt + 1, prettier: Some(new_default_prettier.clone()) });
-                                new_default_prettier
-                            });
-                            return Ok(new_default_prettier);
-                        },
+                ControlFlow::Break(instance) => match instance.prettier {
+                    Some(instance) => return Ok(instance),
+                    None => {
+                        let new_default_prettier = project.update(&mut cx, |project, cx| {
+                            let new_default_prettier =
+                                start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), worktree_id, cx);
+                            project.default_prettier.prettier =
+                                PrettierInstallation::Installed(PrettierInstance {
+                                    attempt: instance.attempt + 1,
+                                    prettier: Some(new_default_prettier.clone()),
+                                });
+                            new_default_prettier
+                        });
+                        return Ok(new_default_prettier);
                     }
                 },
             }
@@ -322,21 +324,6 @@ async fn install_default_prettier(
     node: Arc<dyn NodeRuntime>,
     fs: Arc<dyn Fs>,
 ) -> anyhow::Result<()> {
-    let prettier_wrapper_path = DEFAULT_PRETTIER_DIR.join(prettier::PRETTIER_SERVER_FILE);
-    // method creates parent directory if it doesn't exist
-    fs.save(
-        &prettier_wrapper_path,
-        &text::Rope::from(prettier::PRETTIER_SERVER_JS),
-        text::LineEnding::Unix,
-    )
-    .await
-    .with_context(|| {
-        format!(
-            "writing {} file at {prettier_wrapper_path:?}",
-            prettier::PRETTIER_SERVER_FILE
-        )
-    })?;
-
     let packages_to_versions =
         future::try_join_all(plugins_to_install.iter().chain(Some(&"prettier")).map(
             |package_name| async {
@@ -364,6 +351,23 @@ async fn install_default_prettier(
     anyhow::Ok(())
 }
 
+async fn save_prettier_server_file(fs: &dyn Fs) -> Result<(), anyhow::Error> {
+    let prettier_wrapper_path = DEFAULT_PRETTIER_DIR.join(prettier::PRETTIER_SERVER_FILE);
+    fs.save(
+        &prettier_wrapper_path,
+        &text::Rope::from(prettier::PRETTIER_SERVER_JS),
+        text::LineEnding::Unix,
+    )
+    .await
+    .with_context(|| {
+        format!(
+            "writing {} file at {prettier_wrapper_path:?}",
+            prettier::PRETTIER_SERVER_FILE
+        )
+    })?;
+    Ok(())
+}
+
 impl Project {
     pub fn update_prettier_settings(
         &self,
@@ -662,7 +666,10 @@ impl Project {
                         .map_err(Arc::new)?
                     {
                         ControlFlow::Break(()) => return Ok(()),
-                        ControlFlow::Continue(Some(_non_default_prettier)) => return Ok(()),
+                        ControlFlow::Continue(Some(_non_default_prettier)) => {
+                            save_prettier_server_file(fs.as_ref()).await?;
+                            return Ok(());
+                        }
                         ControlFlow::Continue(None) => {
                             let mut needs_install = match previous_installation_process {
                                 Some(previous_installation_process) => {
@@ -681,6 +688,7 @@ impl Project {
                                 cx.background()
                                     // TODO kb instead of always installing, try to start the existing installation first?
                                     .spawn(async move {
+                                        save_prettier_server_file(fs.as_ref()).await?;
                                         install_default_prettier(plugins_to_install, node, fs).await
                                     })
                                     .await