diff --git a/crates/project/src/prettier_support.rs b/crates/project/src/prettier_support.rs index f59ff20a24..32f32cc0dc 100644 --- a/crates/project/src/prettier_support.rs +++ b/crates/project/src/prettier_support.rs @@ -193,51 +193,53 @@ fn start_default_prettier( ) -> Task> { 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, fs: Arc, ) -> 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