diff options
author | Josh Stone <[email protected]> | 2020-09-16 18:05:41 +0100 |
---|---|---|
committer | Josh Stone <[email protected]> | 2020-09-16 18:05:41 +0100 |
commit | 29c34213916f8be84d5c715899e5e0629e36adac (patch) | |
tree | f6e9e0cc4799d3172957ceea1daa5cd1ad754fa8 /crates | |
parent | b14bf68ce62bc712ed9ca9f977dd7efbd6fe4fd7 (diff) |
Don't return any TextEdit if formatting is unchanged
I found that `textDocument/formatting` was always returning a full
`TextEdit` replacement, even when there are no changes, which caused Vim
(w/ vim-lsp) to always indicate a modified buffer after formatting. We
can easily compare whether there were changes and return `null` if not,
so the client knows there's nothing to do.
Diffstat (limited to 'crates')
-rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 13 | ||||
-rw-r--r-- | crates/rust-analyzer/tests/rust-analyzer/main.rs | 36 |
2 files changed, 45 insertions, 4 deletions
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 64cb4d96c..c0943a54d 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs | |||
@@ -748,10 +748,15 @@ pub(crate) fn handle_formatting( | |||
748 | } | 748 | } |
749 | } | 749 | } |
750 | 750 | ||
751 | Ok(Some(vec![lsp_types::TextEdit { | 751 | if *file == captured_stdout { |
752 | range: Range::new(Position::new(0, 0), end_position), | 752 | // The document is already formatted correctly -- no edits needed. |
753 | new_text: captured_stdout, | 753 | Ok(None) |
754 | }])) | 754 | } else { |
755 | Ok(Some(vec![lsp_types::TextEdit { | ||
756 | range: Range::new(Position::new(0, 0), end_position), | ||
757 | new_text: captured_stdout, | ||
758 | }])) | ||
759 | } | ||
755 | } | 760 | } |
756 | 761 | ||
757 | fn handle_fixes( | 762 | fn handle_fixes( |
diff --git a/crates/rust-analyzer/tests/rust-analyzer/main.rs b/crates/rust-analyzer/tests/rust-analyzer/main.rs index 0880d0425..06726f957 100644 --- a/crates/rust-analyzer/tests/rust-analyzer/main.rs +++ b/crates/rust-analyzer/tests/rust-analyzer/main.rs | |||
@@ -260,6 +260,42 @@ pub use std::collections::HashMap; | |||
260 | } | 260 | } |
261 | 261 | ||
262 | #[test] | 262 | #[test] |
263 | fn test_format_document_unchanged() { | ||
264 | if skip_slow_tests() { | ||
265 | return; | ||
266 | } | ||
267 | |||
268 | let server = project( | ||
269 | r#" | ||
270 | //- /Cargo.toml | ||
271 | [package] | ||
272 | name = "foo" | ||
273 | version = "0.0.0" | ||
274 | |||
275 | //- /src/lib.rs | ||
276 | fn main() {} | ||
277 | "#, | ||
278 | ) | ||
279 | .wait_until_workspace_is_loaded(); | ||
280 | |||
281 | server.request::<Formatting>( | ||
282 | DocumentFormattingParams { | ||
283 | text_document: server.doc_id("src/lib.rs"), | ||
284 | options: FormattingOptions { | ||
285 | tab_size: 4, | ||
286 | insert_spaces: false, | ||
287 | insert_final_newline: None, | ||
288 | trim_final_newlines: None, | ||
289 | trim_trailing_whitespace: None, | ||
290 | properties: HashMap::new(), | ||
291 | }, | ||
292 | work_done_progress_params: WorkDoneProgressParams::default(), | ||
293 | }, | ||
294 | json!(null), | ||
295 | ); | ||
296 | } | ||
297 | |||
298 | #[test] | ||
263 | fn test_missing_module_code_action() { | 299 | fn test_missing_module_code_action() { |
264 | if skip_slow_tests() { | 300 | if skip_slow_tests() { |
265 | return; | 301 | return; |