Transmit new line ending when buffer is reloaded

This commit is contained in:
Antonio Scandurra 2022-07-05 08:01:14 +02:00
parent 3b67ccc62c
commit eac76df0ac
5 changed files with 29 additions and 14 deletions

View File

@ -1244,7 +1244,7 @@ async fn test_buffer_reloading(cx_a: &mut TestAppContext, cx_b: &mut TestAppCont
.insert_tree(
"/dir",
json!({
"a.txt": "a-contents",
"a.txt": "a\nb\nc",
}),
)
.await;
@ -1259,23 +1259,25 @@ async fn test_buffer_reloading(cx_a: &mut TestAppContext, cx_b: &mut TestAppCont
buffer_b.read_with(cx_b, |buf, _| {
assert!(!buf.is_dirty());
assert!(!buf.has_conflict());
assert_eq!(buf.line_ending(), LineEnding::Unix);
});
let new_contents = Rope::from("d\ne\nf");
client_a
.fs
.save(
"/dir/a.txt".as_ref(),
&"new contents".into(),
LineEnding::Unix,
)
.save("/dir/a.txt".as_ref(), &new_contents, LineEnding::Windows)
.await
.unwrap();
buffer_b
.condition(&cx_b, |buf, _| {
buf.text() == "new contents" && !buf.is_dirty()
buf.text() == new_contents.to_string() && !buf.is_dirty()
})
.await;
buffer_b.read_with(cx_b, |buf, _| assert!(!buf.has_conflict()));
buffer_b.read_with(cx_b, |buf, _| {
assert!(!buf.is_dirty());
assert!(!buf.has_conflict());
assert_eq!(buf.line_ending(), LineEnding::Windows);
});
}
#[gpui::test(iterations = 10)]

View File

@ -221,6 +221,7 @@ pub trait LocalFile: File {
buffer_id: u64,
version: &clock::Global,
fingerprint: String,
line_ending: LineEnding,
mtime: SystemTime,
cx: &mut MutableAppContext,
);
@ -562,6 +563,7 @@ impl Buffer {
this.did_reload(
this.version(),
this.as_rope().fingerprint(),
this.line_ending,
new_mtime,
cx,
);
@ -580,17 +582,20 @@ impl Buffer {
&mut self,
version: clock::Global,
fingerprint: String,
line_ending: LineEnding,
mtime: SystemTime,
cx: &mut ModelContext<Self>,
) {
self.saved_version = version;
self.saved_version_fingerprint = fingerprint;
self.line_ending = line_ending;
self.saved_mtime = mtime;
if let Some(file) = self.file.as_ref().and_then(|f| f.as_local()) {
file.buffer_reloaded(
self.remote_id(),
&self.saved_version,
self.saved_version_fingerprint.clone(),
self.line_ending,
self.saved_mtime,
cx,
);
@ -2538,7 +2543,7 @@ impl std::ops::SubAssign for IndentSize {
}
impl LineEnding {
fn from_proto(style: proto::LineEnding) -> Self {
pub fn from_proto(style: proto::LineEnding) -> Self {
match style {
proto::LineEnding::Unix => Self::Unix,
proto::LineEnding::Windows => Self::Windows,
@ -2565,7 +2570,7 @@ impl LineEnding {
}
}
fn to_proto(self) -> proto::LineEnding {
pub fn to_proto(self) -> proto::LineEnding {
match self {
LineEnding::Unix => proto::LineEnding::Unix,
LineEnding::Windows => proto::LineEnding::Windows,

View File

@ -23,8 +23,9 @@ use language::{
proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version},
range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CharKind, CodeAction, CodeLabel,
Completion, Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _,
Language, LanguageRegistry, LanguageServerName, LocalFile, LspAdapter, OffsetRangeExt,
Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction,
Language, LanguageRegistry, LanguageServerName, LineEnding, LocalFile, LspAdapter,
OffsetRangeExt, Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16,
Transaction,
};
use lsp::{
DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, LanguageServer, LanguageString,
@ -5539,8 +5540,12 @@ impl Project {
_: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<()> {
let payload = envelope.payload.clone();
let payload = envelope.payload;
let version = deserialize_version(payload.version);
let line_ending = LineEnding::from_proto(
proto::LineEnding::from_i32(payload.line_ending)
.ok_or_else(|| anyhow!("missing line ending"))?,
);
let mtime = payload
.mtime
.ok_or_else(|| anyhow!("missing mtime"))?
@ -5552,7 +5557,7 @@ impl Project {
.and_then(|buffer| buffer.upgrade(cx));
if let Some(buffer) = buffer {
buffer.update(cx, |buffer, cx| {
buffer.did_reload(version, payload.fingerprint, mtime, cx);
buffer.did_reload(version, payload.fingerprint, line_ending, mtime, cx);
});
}
Ok(())

View File

@ -1736,6 +1736,7 @@ impl language::LocalFile for File {
buffer_id: u64,
version: &clock::Global,
fingerprint: String,
line_ending: LineEnding,
mtime: SystemTime,
cx: &mut MutableAppContext,
) {
@ -1749,6 +1750,7 @@ impl language::LocalFile for File {
version: serialize_version(&version),
mtime: Some(mtime.into()),
fingerprint,
line_ending: line_ending.to_proto() as i32,
})
.log_err();
}

View File

@ -390,6 +390,7 @@ message BufferReloaded {
repeated VectorClockEntry version = 3;
Timestamp mtime = 4;
string fingerprint = 5;
LineEnding line_ending = 6;
}
message ReloadBuffers {