diff --git a/crates/project/src/prettier_support.rs b/crates/project/src/prettier_support.rs index a61589b8b4caf890a19dc9ac993e3a2945577dd0..314c571fd8a200e80ced94c4fdecb8460a33d5ba 100644 --- a/crates/project/src/prettier_support.rs +++ b/crates/project/src/prettier_support.rs @@ -25,6 +25,26 @@ use crate::{ Event, File, FormatOperation, PathChange, Project, ProjectEntryId, Worktree, WorktreeId, }; +pub fn prettier_plugins_for_language(language: &Language, language_settings: &LanguageSettings) -> Option> { + match &language_settings.formatter { + Formatter::Prettier { .. } | Formatter::Auto => {} + Formatter::LanguageServer | Formatter::External { .. } => return None, + }; + let mut prettier_plugins = None; + if language.prettier_parser_name().is_some() { + prettier_plugins + .get_or_insert_with(|| HashSet::default()) + .extend( + language + .lsp_adapters() + .iter() + .flat_map(|adapter| adapter.prettier_plugins()), + ) + } + + prettier_plugins +} + pub(super) async fn format_with_prettier( project: &ModelHandle, buffer: &ModelHandle, @@ -578,15 +598,10 @@ impl Project { pub fn install_default_prettier( &mut self, _worktree: Option, - _new_language: &Language, - language_settings: &LanguageSettings, + _plugins: HashSet<&'static str>, _cx: &mut ModelContext, ) { // suppress unused code warnings - match &language_settings.formatter { - Formatter::Prettier { .. } | Formatter::Auto => {} - Formatter::LanguageServer | Formatter::External { .. } => return, - }; let _ = &self.default_prettier.installed_plugins; } @@ -594,33 +609,12 @@ impl Project { pub fn install_default_prettier( &mut self, worktree: Option, - new_language: &Language, - language_settings: &LanguageSettings, + mut new_plugins: HashSet<&'static str>, cx: &mut ModelContext, ) { - match &language_settings.formatter { - Formatter::Prettier { .. } | Formatter::Auto => {} - Formatter::LanguageServer | Formatter::External { .. } => return, - }; let Some(node) = self.node.as_ref().cloned() else { return; }; - - let mut prettier_plugins = None; - if new_language.prettier_parser_name().is_some() { - prettier_plugins - .get_or_insert_with(|| HashSet::<&'static str>::default()) - .extend( - new_language - .lsp_adapters() - .iter() - .flat_map(|adapter| adapter.prettier_plugins()), - ) - } - let Some(prettier_plugins) = prettier_plugins else { - return; - }; - let fs = Arc::clone(&self.fs); let locate_prettier_installation = match worktree.and_then(|worktree_id| { self.worktree_for_id(worktree_id, cx) @@ -637,9 +631,8 @@ impl Project { .await }) } - None => Task::ready(Ok(ControlFlow::Break(()))), + None => Task::ready(Ok(ControlFlow::Continue(None))), }; - let mut new_plugins = prettier_plugins; new_plugins .retain(|plugin| !self.default_prettier.installed_plugins.contains(plugin)); let mut installation_attempt = 0; diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index ad2a13482b128d69d7aa41fad0b101ef52797f5d..a4ee9fb55296671bb40129df0d9af25bb2180ec2 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -925,8 +925,14 @@ impl Project { .detach(); } + let mut prettier_plugins_by_worktree = HashMap::default(); for (worktree, language, settings) in language_formatters_to_check { - self.install_default_prettier(worktree, &language, &settings, cx); + if let Some(plugins) = prettier_support::prettier_plugins_for_language(&language, &settings) { + prettier_plugins_by_worktree.entry(worktree).or_insert_with(|| HashSet::default()).extend(plugins); + } + } + for (worktree, prettier_plugins) in prettier_plugins_by_worktree { + self.install_default_prettier(worktree, prettier_plugins, cx); } // Start all the newly-enabled language servers. @@ -2682,8 +2688,9 @@ impl Project { let settings = language_settings(Some(&new_language), buffer_file.as_ref(), cx).clone(); let buffer_file = File::from_dyn(buffer_file.as_ref()); let worktree = buffer_file.as_ref().map(|f| f.worktree_id(cx)); - - self.install_default_prettier(worktree, &new_language, &settings, cx); + if let Some(prettier_plugins) = prettier_support::prettier_plugins_for_language(&new_language, &settings) { + self.install_default_prettier(worktree, prettier_plugins, cx); + }; if let Some(file) = buffer_file { let worktree = file.worktree.clone(); if let Some(tree) = worktree.read(cx).as_local() {