Merge pull request #1204 from zed-industries/accurate-is-dirty
Determine `Buffer::is_dirty` based on the rope's fingerprint
This commit is contained in:
@@ -5,7 +5,7 @@ use crate::{
|
||||
};
|
||||
use collections::BTreeMap;
|
||||
use gpui::fonts::HighlightStyle;
|
||||
use language::{Chunk, Edit, Point, PointUtf16, TextSummary};
|
||||
use language::{Chunk, Edit, Point, TextSummary};
|
||||
use parking_lot::Mutex;
|
||||
use std::{
|
||||
any::TypeId,
|
||||
@@ -370,22 +370,10 @@ impl FoldMap {
|
||||
|
||||
if fold.end > fold.start {
|
||||
let output_text = "…";
|
||||
let chars = output_text.chars().count() as u32;
|
||||
let lines = Point::new(0, output_text.len() as u32);
|
||||
let lines_utf16 =
|
||||
PointUtf16::new(0, output_text.encode_utf16().count() as u32);
|
||||
new_transforms.push(
|
||||
Transform {
|
||||
summary: TransformSummary {
|
||||
output: TextSummary {
|
||||
bytes: output_text.len(),
|
||||
lines,
|
||||
lines_utf16,
|
||||
first_line_chars: chars,
|
||||
last_line_chars: chars,
|
||||
longest_row: 0,
|
||||
longest_row_chars: chars,
|
||||
},
|
||||
output: TextSummary::from(output_text),
|
||||
input: new_buffer.text_summary_for_range(fold.start..fold.end),
|
||||
},
|
||||
output_text: Some(output_text),
|
||||
|
||||
@@ -5508,7 +5508,7 @@ impl Editor {
|
||||
cx.emit(Event::BufferEdited);
|
||||
}
|
||||
language::Event::Reparsed => cx.emit(Event::Reparsed),
|
||||
language::Event::Dirtied => cx.emit(Event::Dirtied),
|
||||
language::Event::DirtyChanged => cx.emit(Event::DirtyChanged),
|
||||
language::Event::Saved => cx.emit(Event::Saved),
|
||||
language::Event::FileHandleChanged => cx.emit(Event::TitleChanged),
|
||||
language::Event::Reloaded => cx.emit(Event::TitleChanged),
|
||||
@@ -5665,7 +5665,7 @@ pub enum Event {
|
||||
Edited,
|
||||
Reparsed,
|
||||
Blurred,
|
||||
Dirtied,
|
||||
DirtyChanged,
|
||||
Saved,
|
||||
TitleChanged,
|
||||
SelectionsChanged { local: bool },
|
||||
@@ -6181,7 +6181,10 @@ mod tests {
|
||||
let events = events.clone();
|
||||
|cx| {
|
||||
cx.subscribe(&cx.handle(), move |_, _, event, _| {
|
||||
if matches!(event, Event::Edited | Event::BufferEdited | Event::Dirtied) {
|
||||
if matches!(
|
||||
event,
|
||||
Event::Edited | Event::BufferEdited | Event::DirtyChanged
|
||||
) {
|
||||
events.borrow_mut().push(("editor1", *event));
|
||||
}
|
||||
})
|
||||
@@ -6193,7 +6196,10 @@ mod tests {
|
||||
let events = events.clone();
|
||||
|cx| {
|
||||
cx.subscribe(&cx.handle(), move |_, _, event, _| {
|
||||
if matches!(event, Event::Edited | Event::BufferEdited | Event::Dirtied) {
|
||||
if matches!(
|
||||
event,
|
||||
Event::Edited | Event::BufferEdited | Event::DirtyChanged
|
||||
) {
|
||||
events.borrow_mut().push(("editor2", *event));
|
||||
}
|
||||
})
|
||||
@@ -6211,8 +6217,8 @@ mod tests {
|
||||
("editor1", Event::Edited),
|
||||
("editor1", Event::BufferEdited),
|
||||
("editor2", Event::BufferEdited),
|
||||
("editor1", Event::Dirtied),
|
||||
("editor2", Event::Dirtied)
|
||||
("editor1", Event::DirtyChanged),
|
||||
("editor2", Event::DirtyChanged)
|
||||
]
|
||||
);
|
||||
|
||||
@@ -6235,6 +6241,8 @@ mod tests {
|
||||
("editor1", Event::Edited),
|
||||
("editor1", Event::BufferEdited),
|
||||
("editor2", Event::BufferEdited),
|
||||
("editor1", Event::DirtyChanged),
|
||||
("editor2", Event::DirtyChanged),
|
||||
]
|
||||
);
|
||||
|
||||
@@ -6246,6 +6254,8 @@ mod tests {
|
||||
("editor1", Event::Edited),
|
||||
("editor1", Event::BufferEdited),
|
||||
("editor2", Event::BufferEdited),
|
||||
("editor1", Event::DirtyChanged),
|
||||
("editor2", Event::DirtyChanged),
|
||||
]
|
||||
);
|
||||
|
||||
@@ -6257,6 +6267,8 @@ mod tests {
|
||||
("editor2", Event::Edited),
|
||||
("editor1", Event::BufferEdited),
|
||||
("editor2", Event::BufferEdited),
|
||||
("editor1", Event::DirtyChanged),
|
||||
("editor2", Event::DirtyChanged),
|
||||
]
|
||||
);
|
||||
|
||||
@@ -6268,6 +6280,8 @@ mod tests {
|
||||
("editor2", Event::Edited),
|
||||
("editor1", Event::BufferEdited),
|
||||
("editor2", Event::BufferEdited),
|
||||
("editor1", Event::DirtyChanged),
|
||||
("editor2", Event::DirtyChanged),
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
@@ -440,7 +440,10 @@ impl Item for Editor {
|
||||
}
|
||||
|
||||
fn should_update_tab_on_event(event: &Event) -> bool {
|
||||
matches!(event, Event::Saved | Event::Dirtied | Event::TitleChanged)
|
||||
matches!(
|
||||
event,
|
||||
Event::Saved | Event::DirtyChanged | Event::TitleChanged
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1923,15 +1923,7 @@ impl MultiBufferSnapshot {
|
||||
);
|
||||
|
||||
if range.end > end_before_newline {
|
||||
summary.add_assign(&D::from_text_summary(&TextSummary {
|
||||
bytes: 1,
|
||||
lines: Point::new(1 as u32, 0),
|
||||
lines_utf16: PointUtf16::new(1 as u32, 0),
|
||||
first_line_chars: 0,
|
||||
last_line_chars: 0,
|
||||
longest_row: 0,
|
||||
longest_row_chars: 0,
|
||||
}));
|
||||
summary.add_assign(&D::from_text_summary(&TextSummary::from("\n")));
|
||||
}
|
||||
|
||||
cursor.next(&());
|
||||
|
||||
Reference in New Issue
Block a user