Initialize prettier right after the buffer gets it language

This commit is contained in:
Kirill Bulatov 2023-10-11 14:46:59 +03:00
parent 986a516bf1
commit 4a88a9e253

View file

@ -911,7 +911,8 @@ impl Project {
} }
for (worktree, language, settings) in language_formatters_to_check { for (worktree, language, settings) in language_formatters_to_check {
self.install_default_formatters(worktree, &language, &settings, cx); self.install_default_formatters(worktree, &language, &settings, cx)
.detach_and_log_err(cx);
} }
// Start all the newly-enabled language servers. // Start all the newly-enabled language servers.
@ -2666,7 +2667,20 @@ 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));
self.install_default_formatters(worktree, &new_language, &settings, cx);
let task_buffer = buffer.clone();
let prettier_installation_task =
self.install_default_formatters(worktree, &new_language, &settings, cx);
cx.spawn(|project, mut cx| async move {
prettier_installation_task.await?;
let _ = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(&task_buffer, cx)
})
.await;
anyhow::Ok(())
})
.detach_and_log_err(cx);
if let Some(file) = buffer_file { if let Some(file) = buffer_file {
let worktree = file.worktree.clone(); let worktree = file.worktree.clone();
@ -8393,7 +8407,7 @@ impl Project {
let Some(node) = self.node.as_ref().map(Arc::clone) else { let Some(node) = self.node.as_ref().map(Arc::clone) else {
return Task::ready(None); return Task::ready(None);
}; };
let task = cx.spawn(|this, mut cx| async move { cx.spawn(|this, mut cx| async move {
let fs = this.update(&mut cx, |project, _| Arc::clone(&project.fs)); let fs = this.update(&mut cx, |project, _| Arc::clone(&project.fs));
let prettier_dir = match cx let prettier_dir = match cx
.background() .background()
@ -8494,9 +8508,6 @@ impl Project {
project project
.supplementary_language_servers .supplementary_language_servers
.insert(new_server_id, (name, Arc::clone(prettier_server))); .insert(new_server_id, (name, Arc::clone(prettier_server)));
// TODO kb could there be a race with multiple default prettier instances added?
// also, clean up prettiers for dropped workspaces (e.g. external files that got closed)
// also, is there a way to speed up initial prettier startup? now it takes a 1s or so on the first formatting attempt.
cx.emit(Event::LanguageServerAdded(new_server_id)); cx.emit(Event::LanguageServerAdded(new_server_id));
}); });
} }
@ -8509,15 +8520,14 @@ impl Project {
.insert((worktree_id, prettier_dir), new_prettier_task.clone()); .insert((worktree_id, prettier_dir), new_prettier_task.clone());
}); });
Some(new_prettier_task) Some(new_prettier_task)
}); })
task
} else if let Some(project_id) = self.remote_id() { } else if let Some(project_id) = self.remote_id() {
let client = self.client.clone(); let client = self.client.clone();
let request = proto::PrettierInstanceForBuffer { let request = proto::PrettierInstanceForBuffer {
project_id, project_id,
buffer_id: buffer.remote_id(), buffer_id: buffer.remote_id(),
}; };
let task = cx.spawn(|this, mut cx| async move { cx.spawn(|this, mut cx| async move {
match client.request(request).await { match client.request(request).await {
Ok(response) => { Ok(response) => {
response response
@ -8548,9 +8558,7 @@ impl Project {
None None
} }
} }
}); })
task
} else { } else {
Task::ready(Some( Task::ready(Some(
Task::ready(Err(Arc::new(anyhow!("project does not have a remote id")))).shared(), Task::ready(Err(Arc::new(anyhow!("project does not have a remote id")))).shared(),
@ -8564,13 +8572,13 @@ impl Project {
new_language: &Language, new_language: &Language,
language_settings: &LanguageSettings, language_settings: &LanguageSettings,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) { ) -> Task<anyhow::Result<()>> {
match &language_settings.formatter { match &language_settings.formatter {
Formatter::Prettier { .. } | Formatter::Auto => {} Formatter::Prettier { .. } | Formatter::Auto => {}
Formatter::LanguageServer | Formatter::External { .. } => return, Formatter::LanguageServer | Formatter::External { .. } => return Task::ready(Ok(())),
}; };
let Some(node) = self.node.as_ref().cloned() else { let Some(node) = self.node.as_ref().cloned() else {
return; return Task::ready(Ok(()));
}; };
let mut prettier_plugins = None; let mut prettier_plugins = None;
@ -8586,7 +8594,7 @@ impl Project {
} }
} }
let Some(prettier_plugins) = prettier_plugins else { let Some(prettier_plugins) = prettier_plugins else {
return; return Task::ready(Ok(()));
}; };
let default_prettier_dir = DEFAULT_PRETTIER_DIR.as_path(); let default_prettier_dir = DEFAULT_PRETTIER_DIR.as_path();
@ -8634,7 +8642,6 @@ impl Project {
anyhow::Ok(()) anyhow::Ok(())
}) })
.detach_and_log_err(cx);
} }
} }