diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 8ea9edc84f..3f58e3c93e 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -520,10 +520,17 @@ pub fn handle_formatting( let end_position = TextUnit::of_str(&file).conv_with(&file_line_index); use std::process; - let mut rustfmt = process::Command::new("rustfmt") + let mut rustfmt = process::Command::new("rustfmt"); + rustfmt .stdin(process::Stdio::piped()) - .stdout(process::Stdio::piped()) - .spawn()?; + .stdout(process::Stdio::piped()); + + if let Ok(path) = params.text_document.uri.to_file_path() { + if let Some(parent) = path.parent() { + rustfmt.current_dir(parent); + } + } + let mut rustfmt = rustfmt.spawn()?; rustfmt.stdin.as_mut().unwrap().write_all(file.as_bytes())?; @@ -531,7 +538,9 @@ pub fn handle_formatting( let captured_stdout = String::from_utf8(output.stdout)?; if !output.status.success() { failure::bail!( - "rustfmt exited with error code {}: {}.", + r#"rustfmt exited with: + Status: {} + stdout: {}"#, output.status, captured_stdout, ); diff --git a/crates/ra_lsp_server/src/project_model/cargo_workspace.rs b/crates/ra_lsp_server/src/project_model/cargo_workspace.rs index 75ae78bca7..8cf99d5865 100644 --- a/crates/ra_lsp_server/src/project_model/cargo_workspace.rs +++ b/crates/ra_lsp_server/src/project_model/cargo_workspace.rs @@ -117,9 +117,13 @@ impl Target { impl CargoWorkspace { pub fn from_cargo_metadata(cargo_toml: &Path) -> Result { - let meta = MetadataCommand::new() - .manifest_path(cargo_toml) - .features(CargoOpt::AllFeatures) + let mut meta = MetadataCommand::new(); + meta.manifest_path(cargo_toml) + .features(CargoOpt::AllFeatures); + if let Some(parent) = cargo_toml.parent() { + meta.current_dir(parent); + } + let meta = meta .exec() .map_err(|e| format_err!("cargo metadata failed: {}", e))?; let mut pkg_by_id = FxHashMap::default();