Skip to content

Commit

Permalink
Auto merge of #15600 - davidbarsky:davidbarsky/broken-rustfmt-in-ra, …
Browse files Browse the repository at this point in the history
…r=Veykril

fix: ensure `rustfmt` runs when configured with `./`

(Hopefully) resolves #15595. This change kinda approaches canonicalization—which I am not a fan of—but only in service of making `./`-configured commands run correctly.

Longer-term, I feel like this code should be removed once `rustfmt` supports recursive searches of configuration files or interpolation of values like `${workspace_folder}` lands in rust-analyzer.

## Testing

I cloned `rustc`, setup rust-analyzer as suggested in the [`rustc` dev guide](https://rustc-dev-guide.rust-lang.org/building/suggested.html#configuring-rust-analyzer-for-rustc), saved and formatted files in `src/tools/miri` and `compiler`, and saw `rustfmt` (seemingly) correctly.
  • Loading branch information
bors committed Oct 6, 2023
2 parents ef58843 + b3ebc9a commit b1f89a8
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion crates/rust-analyzer/src/handlers/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use std::{
fs,
io::Write as _,
path::PathBuf,
process::{self, Stdio},
};

Expand Down Expand Up @@ -1995,14 +1996,34 @@ fn run_rustfmt(
cmd
}
RustfmtConfig::CustomCommand { command, args } => {
let mut cmd = process::Command::new(command);
let cmd = PathBuf::from(&command);
let workspace = CargoTargetSpec::for_file(&snap, file_id)?;
let mut cmd = match workspace {
Some(spec) => {
// approach: if the command name contains a path seperator, join it with the workspace root.
// however, if the path is absolute, joining will result in the absolute path being preserved.
// as a fallback, rely on $PATH-based discovery.
let cmd_path =
if cfg!(windows) && command.contains(&[std::path::MAIN_SEPARATOR, '/']) {
spec.workspace_root.join(cmd).into()
} else if command.contains(std::path::MAIN_SEPARATOR) {
spec.workspace_root.join(cmd).into()
} else {
cmd
};
process::Command::new(cmd_path)
}
None => process::Command::new(cmd),
};

cmd.envs(snap.config.extra_env());
cmd.args(args);
cmd
}
};

tracing::debug!(?command, "created format command");

// try to chdir to the file so we can respect `rustfmt.toml`
// FIXME: use `rustfmt --config-path` once
// https://github.com/rust-lang/rustfmt/issues/4660 gets fixed
Expand Down

0 comments on commit b1f89a8

Please sign in to comment.