mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-16 01:38:13 +00:00
Normalize line endings when formatting
This commit is contained in:
parent
41454eb1eb
commit
c49d5f757c
1 changed files with 15 additions and 3 deletions
|
@ -31,12 +31,13 @@ use serde_json::to_value;
|
||||||
use stdx::{format_to, split_once};
|
use stdx::{format_to, split_once};
|
||||||
use syntax::{algo, ast, AstNode, TextRange, TextSize};
|
use syntax::{algo, ast, AstNode, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::diff::diff;
|
|
||||||
use crate::{
|
use crate::{
|
||||||
cargo_target_spec::CargoTargetSpec,
|
cargo_target_spec::CargoTargetSpec,
|
||||||
config::RustfmtConfig,
|
config::RustfmtConfig,
|
||||||
|
diff::diff,
|
||||||
from_json, from_proto,
|
from_json, from_proto,
|
||||||
global_state::{GlobalState, GlobalStateSnapshot},
|
global_state::{GlobalState, GlobalStateSnapshot},
|
||||||
|
line_endings::LineEndings,
|
||||||
lsp_ext::{self, InlayHint, InlayHintsParams},
|
lsp_ext::{self, InlayHint, InlayHintsParams},
|
||||||
lsp_utils::all_edits_are_disjoint,
|
lsp_utils::all_edits_are_disjoint,
|
||||||
to_proto, LspError, Result,
|
to_proto, LspError, Result,
|
||||||
|
@ -909,14 +910,25 @@ pub(crate) fn handle_formatting(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if *file == captured_stdout {
|
let (new_text, new_line_endings) = LineEndings::normalize(captured_stdout);
|
||||||
|
|
||||||
|
if file_line_endings != new_line_endings {
|
||||||
|
// If line endings are different, send the entire file.
|
||||||
|
// Diffing would not work here, as the line endings might be the only
|
||||||
|
// difference.
|
||||||
|
Ok(Some(to_proto::text_edit_vec(
|
||||||
|
&file_line_index,
|
||||||
|
new_line_endings,
|
||||||
|
TextEdit::replace(TextRange::up_to(TextSize::of(&*file)), new_text),
|
||||||
|
)))
|
||||||
|
} else if *file == new_text {
|
||||||
// The document is already formatted correctly -- no edits needed.
|
// The document is already formatted correctly -- no edits needed.
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
Ok(Some(to_proto::text_edit_vec(
|
Ok(Some(to_proto::text_edit_vec(
|
||||||
&file_line_index,
|
&file_line_index,
|
||||||
file_line_endings,
|
file_line_endings,
|
||||||
diff(&file, &captured_stdout),
|
diff(&file, &new_text),
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue