Simplify default prettier installation function
This commit is contained in:
parent
96f6b89508
commit
f1314afe35
2 changed files with 33 additions and 33 deletions
|
@ -25,6 +25,26 @@ use crate::{
|
||||||
Event, File, FormatOperation, PathChange, Project, ProjectEntryId, Worktree, WorktreeId,
|
Event, File, FormatOperation, PathChange, Project, ProjectEntryId, Worktree, WorktreeId,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub fn prettier_plugins_for_language(language: &Language, language_settings: &LanguageSettings) -> Option<HashSet<&'static str>> {
|
||||||
|
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(
|
pub(super) async fn format_with_prettier(
|
||||||
project: &ModelHandle<Project>,
|
project: &ModelHandle<Project>,
|
||||||
buffer: &ModelHandle<Buffer>,
|
buffer: &ModelHandle<Buffer>,
|
||||||
|
@ -578,15 +598,10 @@ impl Project {
|
||||||
pub fn install_default_prettier(
|
pub fn install_default_prettier(
|
||||||
&mut self,
|
&mut self,
|
||||||
_worktree: Option<WorktreeId>,
|
_worktree: Option<WorktreeId>,
|
||||||
_new_language: &Language,
|
_plugins: HashSet<&'static str>,
|
||||||
language_settings: &LanguageSettings,
|
|
||||||
_cx: &mut ModelContext<Self>,
|
_cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
// suppress unused code warnings
|
// suppress unused code warnings
|
||||||
match &language_settings.formatter {
|
|
||||||
Formatter::Prettier { .. } | Formatter::Auto => {}
|
|
||||||
Formatter::LanguageServer | Formatter::External { .. } => return,
|
|
||||||
};
|
|
||||||
let _ = &self.default_prettier.installed_plugins;
|
let _ = &self.default_prettier.installed_plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,33 +609,12 @@ impl Project {
|
||||||
pub fn install_default_prettier(
|
pub fn install_default_prettier(
|
||||||
&mut self,
|
&mut self,
|
||||||
worktree: Option<WorktreeId>,
|
worktree: Option<WorktreeId>,
|
||||||
new_language: &Language,
|
mut new_plugins: HashSet<&'static str>,
|
||||||
language_settings: &LanguageSettings,
|
|
||||||
cx: &mut ModelContext<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
match &language_settings.formatter {
|
|
||||||
Formatter::Prettier { .. } | Formatter::Auto => {}
|
|
||||||
Formatter::LanguageServer | Formatter::External { .. } => return,
|
|
||||||
};
|
|
||||||
let Some(node) = self.node.as_ref().cloned() else {
|
let Some(node) = self.node.as_ref().cloned() else {
|
||||||
return;
|
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 fs = Arc::clone(&self.fs);
|
||||||
let locate_prettier_installation = match worktree.and_then(|worktree_id| {
|
let locate_prettier_installation = match worktree.and_then(|worktree_id| {
|
||||||
self.worktree_for_id(worktree_id, cx)
|
self.worktree_for_id(worktree_id, cx)
|
||||||
|
@ -637,9 +631,8 @@ impl Project {
|
||||||
.await
|
.await
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
None => Task::ready(Ok(ControlFlow::Break(()))),
|
None => Task::ready(Ok(ControlFlow::Continue(None))),
|
||||||
};
|
};
|
||||||
let mut new_plugins = prettier_plugins;
|
|
||||||
new_plugins
|
new_plugins
|
||||||
.retain(|plugin| !self.default_prettier.installed_plugins.contains(plugin));
|
.retain(|plugin| !self.default_prettier.installed_plugins.contains(plugin));
|
||||||
let mut installation_attempt = 0;
|
let mut installation_attempt = 0;
|
||||||
|
|
|
@ -925,8 +925,14 @@ impl Project {
|
||||||
.detach();
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut prettier_plugins_by_worktree = HashMap::default();
|
||||||
for (worktree, language, settings) in language_formatters_to_check {
|
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.
|
// 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 settings = language_settings(Some(&new_language), buffer_file.as_ref(), cx).clone();
|
||||||
let buffer_file = File::from_dyn(buffer_file.as_ref());
|
let buffer_file = File::from_dyn(buffer_file.as_ref());
|
||||||
let worktree = buffer_file.as_ref().map(|f| f.worktree_id(cx));
|
let worktree = buffer_file.as_ref().map(|f| f.worktree_id(cx));
|
||||||
|
if let Some(prettier_plugins) = prettier_support::prettier_plugins_for_language(&new_language, &settings) {
|
||||||
self.install_default_prettier(worktree, &new_language, &settings, cx);
|
self.install_default_prettier(worktree, prettier_plugins, cx);
|
||||||
|
};
|
||||||
if let Some(file) = buffer_file {
|
if let Some(file) = buffer_file {
|
||||||
let worktree = file.worktree.clone();
|
let worktree = file.worktree.clone();
|
||||||
if let Some(tree) = worktree.read(cx).as_local() {
|
if let Some(tree) = worktree.read(cx).as_local() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue