diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index c13cdc4e3..071b34cda 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs | |||
@@ -31,12 +31,13 @@ use serde_json::to_value; | |||
31 | use stdx::{format_to, split_once}; | 31 | use stdx::{format_to, split_once}; |
32 | use syntax::{algo, ast, AstNode, TextRange, TextSize}; | 32 | use syntax::{algo, ast, AstNode, TextRange, TextSize}; |
33 | 33 | ||
34 | use crate::diff::diff; | ||
35 | use crate::{ | 34 | use crate::{ |
36 | cargo_target_spec::CargoTargetSpec, | 35 | cargo_target_spec::CargoTargetSpec, |
37 | config::RustfmtConfig, | 36 | config::RustfmtConfig, |
37 | diff::diff, | ||
38 | from_json, from_proto, | 38 | from_json, from_proto, |
39 | global_state::{GlobalState, GlobalStateSnapshot}, | 39 | global_state::{GlobalState, GlobalStateSnapshot}, |
40 | line_endings::LineEndings, | ||
40 | lsp_ext::{self, InlayHint, InlayHintsParams}, | 41 | lsp_ext::{self, InlayHint, InlayHintsParams}, |
41 | lsp_utils::all_edits_are_disjoint, | 42 | lsp_utils::all_edits_are_disjoint, |
42 | to_proto, LspError, Result, | 43 | to_proto, LspError, Result, |
@@ -906,14 +907,25 @@ pub(crate) fn handle_formatting( | |||
906 | } | 907 | } |
907 | } | 908 | } |
908 | 909 | ||
909 | if *file == captured_stdout { | 910 | let (new_text, new_line_endings) = LineEndings::normalize(captured_stdout); |
911 | |||
912 | if file_line_endings != new_line_endings { | ||
913 | // If line endings are different, send the entire file. | ||
914 | // Diffing would not work here, as the line endings might be the only | ||
915 | // difference. | ||
916 | Ok(Some(to_proto::text_edit_vec( | ||
917 | &file_line_index, | ||
918 | new_line_endings, | ||
919 | TextEdit::replace(TextRange::up_to(TextSize::of(&*file)), new_text), | ||
920 | ))) | ||
921 | } else if *file == new_text { | ||
910 | // The document is already formatted correctly -- no edits needed. | 922 | // The document is already formatted correctly -- no edits needed. |
911 | Ok(None) | 923 | Ok(None) |
912 | } else { | 924 | } else { |
913 | Ok(Some(to_proto::text_edit_vec( | 925 | Ok(Some(to_proto::text_edit_vec( |
914 | &file_line_index, | 926 | &file_line_index, |
915 | file_line_endings, | 927 | file_line_endings, |
916 | diff(&file, &captured_stdout), | 928 | diff(&file, &new_text), |
917 | ))) | 929 | ))) |
918 | } | 930 | } |
919 | } | 931 | } |