diff options
Diffstat (limited to 'crates/ra_lsp_server')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop/handlers.rs | 28 | ||||
-rw-r--r-- | crates/ra_lsp_server/src/project_model/cargo_workspace.rs | 10 |
2 files changed, 27 insertions, 11 deletions
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 8ea9edc84..ace3da020 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs | |||
@@ -520,21 +520,33 @@ pub fn handle_formatting( | |||
520 | let end_position = TextUnit::of_str(&file).conv_with(&file_line_index); | 520 | let end_position = TextUnit::of_str(&file).conv_with(&file_line_index); |
521 | 521 | ||
522 | use std::process; | 522 | use std::process; |
523 | let mut rustfmt = process::Command::new("rustfmt") | 523 | let mut rustfmt = process::Command::new("rustfmt"); |
524 | rustfmt | ||
524 | .stdin(process::Stdio::piped()) | 525 | .stdin(process::Stdio::piped()) |
525 | .stdout(process::Stdio::piped()) | 526 | .stdout(process::Stdio::piped()); |
526 | .spawn()?; | 527 | |
528 | if let Ok(path) = params.text_document.uri.to_file_path() { | ||
529 | if let Some(parent) = path.parent() { | ||
530 | rustfmt.current_dir(parent); | ||
531 | } | ||
532 | } | ||
533 | let mut rustfmt = rustfmt.spawn()?; | ||
527 | 534 | ||
528 | rustfmt.stdin.as_mut().unwrap().write_all(file.as_bytes())?; | 535 | rustfmt.stdin.as_mut().unwrap().write_all(file.as_bytes())?; |
529 | 536 | ||
530 | let output = rustfmt.wait_with_output()?; | 537 | let output = rustfmt.wait_with_output()?; |
531 | let captured_stdout = String::from_utf8(output.stdout)?; | 538 | let captured_stdout = String::from_utf8(output.stdout)?; |
532 | if !output.status.success() { | 539 | if !output.status.success() { |
533 | failure::bail!( | 540 | return Err(LspError::new( |
534 | "rustfmt exited with error code {}: {}.", | 541 | -32900, |
535 | output.status, | 542 | format!( |
536 | captured_stdout, | 543 | r#"rustfmt exited with: |
537 | ); | 544 | Status: {} |
545 | stdout: {}"#, | ||
546 | output.status, captured_stdout, | ||
547 | ), | ||
548 | ) | ||
549 | .into()); | ||
538 | } | 550 | } |
539 | 551 | ||
540 | Ok(Some(vec![TextEdit { | 552 | Ok(Some(vec![TextEdit { |
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 75ae78bca..8cf99d586 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 { | |||
117 | 117 | ||
118 | impl CargoWorkspace { | 118 | impl CargoWorkspace { |
119 | pub fn from_cargo_metadata(cargo_toml: &Path) -> Result<CargoWorkspace> { | 119 | pub fn from_cargo_metadata(cargo_toml: &Path) -> Result<CargoWorkspace> { |
120 | let meta = MetadataCommand::new() | 120 | let mut meta = MetadataCommand::new(); |
121 | .manifest_path(cargo_toml) | 121 | meta.manifest_path(cargo_toml) |
122 | .features(CargoOpt::AllFeatures) | 122 | .features(CargoOpt::AllFeatures); |
123 | if let Some(parent) = cargo_toml.parent() { | ||
124 | meta.current_dir(parent); | ||
125 | } | ||
126 | let meta = meta | ||
123 | .exec() | 127 | .exec() |
124 | .map_err(|e| format_err!("cargo metadata failed: {}", e))?; | 128 | .map_err(|e| format_err!("cargo metadata failed: {}", e))?; |
125 | let mut pkg_by_id = FxHashMap::default(); | 129 | let mut pkg_by_id = FxHashMap::default(); |