diff --git a/src/formatter/clang.rs b/src/formatter/clang.rs index d2e72d5..08e54c1 100644 --- a/src/formatter/clang.rs +++ b/src/formatter/clang.rs @@ -85,13 +85,14 @@ impl ClangFormatter { Some(p) } - fn get_command(&self, u: &Path) -> Command { + fn get_command(&self, f: &str, u: &Path) -> Option { let mut c = Command::new(self.path.as_str()); if let Some(wd) = self.working_dir.as_ref() { c.current_dir(wd.as_str()); } - c.args([u.to_str().unwrap(), "--output-replacements-xml"]); - c + c.stdin(File::open(u).ok()?); + c.args(["--output-replacements-xml", format!("--assume-filename={f}").as_str()]); + Some(c) } fn output_to_textedit(&self, output: &str, content: &str) -> Option> { @@ -107,9 +108,10 @@ impl ClangFormatter { } impl ProtoFormatter for ClangFormatter { - fn format_document(&self, content: &str) -> Option> { + fn format_document(&self, filename: &str, content: &str) -> Option> { let p = self.get_temp_file_path(content)?; - let output = self.get_command(p.as_ref()).output().ok()?; + let mut cmd = self.get_command(filename, p.as_ref())?; + let output = cmd.output().ok()?; if !output.status.success() { tracing::error!( status = output.status.code(), @@ -120,12 +122,12 @@ impl ProtoFormatter for ClangFormatter { self.output_to_textedit(&String::from_utf8_lossy(&output.stdout), content) } - fn format_document_range(&self, r: &Range, content: &str) -> Option> { + fn format_document_range(&self, r: &Range, filename: &str, content: &str) -> Option> { let p = self.get_temp_file_path(content)?; let start = r.start.line + 1; let end = r.end.line + 1; let output = self - .get_command(p.as_ref()) + .get_command(filename, p.as_ref())? .args(["--lines", format!("{start}:{end}").as_str()]) .output() .ok()?; diff --git a/src/formatter/mod.rs b/src/formatter/mod.rs index 67f6913..d5e1993 100644 --- a/src/formatter/mod.rs +++ b/src/formatter/mod.rs @@ -3,6 +3,6 @@ use async_lsp::lsp_types::{Range, TextEdit}; pub mod clang; pub trait ProtoFormatter: Sized { - fn format_document(&self, content: &str) -> Option>; - fn format_document_range(&self, r: &Range, content: &str) -> Option>; + fn format_document(&self, filename: &str, content: &str) -> Option>; + fn format_document_range(&self, r: &Range, filename: &str, content: &str) -> Option>; } diff --git a/src/lsp.rs b/src/lsp.rs index 3674d43..0d9b59a 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -375,7 +375,7 @@ impl LanguageServer for ProtoLanguageServer { let response = self .state .get_formatter() - .and_then(|f| f.format_document(content.as_str())); + .and_then(|f| f.format_document(uri.path(), content.as_str())); Box::pin(async move { Ok(response) }) } @@ -390,7 +390,7 @@ impl LanguageServer for ProtoLanguageServer { let response = self .state .get_formatter() - .and_then(|f| f.format_document_range(¶ms.range, content.as_str())); + .and_then(|f| f.format_document_range(¶ms.range, uri.path(), content.as_str())); Box::pin(async move { Ok(response) }) }