Look for the external formatter before invoking it (#3670)

Currently it is not possible to save a file with a language that
has an external formatter configuration unless the external
formatter is installed, even if the language has a Language Server
configuration capable of auto-format. This change checks that the
external formatter exists before using it to create a formatting
callback.
This commit is contained in:
Michael Davis 2022-09-03 23:29:20 -05:00 committed by GitHub
parent 0d76775453
commit f0d1caafcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -407,7 +407,11 @@ pub fn auto_format(&self) -> Option<BoxFuture<'static, Result<Transaction, Forma
// We can't use anyhow::Result here since the output of the future has to be // We can't use anyhow::Result here since the output of the future has to be
// clonable to be used as shared future. So use a custom error type. // clonable to be used as shared future. So use a custom error type.
pub fn format(&self) -> Option<BoxFuture<'static, Result<Transaction, FormatterError>>> { pub fn format(&self) -> Option<BoxFuture<'static, Result<Transaction, FormatterError>>> {
if let Some(formatter) = self.language_config().and_then(|c| c.formatter.clone()) { if let Some(formatter) = self
.language_config()
.and_then(|c| c.formatter.clone())
.filter(|formatter| which::which(&formatter.command).is_ok())
{
use std::process::Stdio; use std::process::Stdio;
let text = self.text().clone(); let text = self.text().clone();
let mut process = tokio::process::Command::new(&formatter.command); let mut process = tokio::process::Command::new(&formatter.command);