Fix two issues with diff highlights (#24309)
* fix syntax highlighting of deleted text when buffer language changes * do not highlight entire untracked files as created, except in the project diff view Release Notes: - N/A Co-authored-by: ConradIrwin <conrad.irwin@gmail.com> Co-authored-by: cole-miller <m@cole-miller.net>
This commit is contained in:
parent
9114ca973c
commit
ca01a8b9cb
5 changed files with 126 additions and 52 deletions
|
@ -220,6 +220,22 @@ struct ChangeSetState {
|
|||
_subscription: gpui::Subscription,
|
||||
}
|
||||
|
||||
impl ChangeSetState {
|
||||
fn new(change_set: Entity<BufferChangeSet>, cx: &mut Context<MultiBuffer>) -> Self {
|
||||
ChangeSetState {
|
||||
_subscription: cx.subscribe(&change_set, |this, change_set, event, cx| match event {
|
||||
BufferChangeSetEvent::DiffChanged { changed_range } => {
|
||||
this.buffer_diff_changed(change_set, changed_range.clone(), cx)
|
||||
}
|
||||
BufferChangeSetEvent::LanguageChanged => {
|
||||
this.buffer_diff_language_changed(change_set, cx)
|
||||
}
|
||||
}),
|
||||
change_set,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The contents of a [`MultiBuffer`] at a single point in time.
|
||||
#[derive(Clone, Default)]
|
||||
pub struct MultiBufferSnapshot {
|
||||
|
@ -560,17 +576,7 @@ impl MultiBuffer {
|
|||
for (buffer_id, change_set_state) in self.diff_bases.iter() {
|
||||
diff_bases.insert(
|
||||
*buffer_id,
|
||||
ChangeSetState {
|
||||
_subscription: new_cx.subscribe(
|
||||
&change_set_state.change_set,
|
||||
|this, change_set, event, cx| match event {
|
||||
BufferChangeSetEvent::DiffChanged { changed_range } => {
|
||||
this.buffer_diff_changed(change_set, changed_range.clone(), cx)
|
||||
}
|
||||
},
|
||||
),
|
||||
change_set: change_set_state.change_set.clone(),
|
||||
},
|
||||
ChangeSetState::new(change_set_state.change_set.clone(), new_cx),
|
||||
);
|
||||
}
|
||||
Self {
|
||||
|
@ -2146,6 +2152,30 @@ impl MultiBuffer {
|
|||
});
|
||||
}
|
||||
|
||||
fn buffer_diff_language_changed(
|
||||
&mut self,
|
||||
change_set: Entity<BufferChangeSet>,
|
||||
cx: &mut Context<Self>,
|
||||
) {
|
||||
self.sync(cx);
|
||||
let mut snapshot = self.snapshot.borrow_mut();
|
||||
let change_set = change_set.read(cx);
|
||||
let buffer_id = change_set.buffer_id;
|
||||
let base_text = change_set.base_text.clone();
|
||||
let diff = change_set.diff_to_buffer.clone();
|
||||
if let Some(base_text) = base_text {
|
||||
snapshot.diffs.insert(
|
||||
buffer_id,
|
||||
DiffSnapshot {
|
||||
diff: diff.clone(),
|
||||
base_text,
|
||||
},
|
||||
);
|
||||
} else {
|
||||
snapshot.diffs.remove(&buffer_id);
|
||||
}
|
||||
}
|
||||
|
||||
fn buffer_diff_changed(
|
||||
&mut self,
|
||||
change_set: Entity<BufferChangeSet>,
|
||||
|
@ -2175,6 +2205,15 @@ impl MultiBuffer {
|
|||
base_text,
|
||||
},
|
||||
);
|
||||
} else if self.all_diff_hunks_expanded {
|
||||
let base_text = Buffer::build_empty_snapshot(cx);
|
||||
snapshot.diffs.insert(
|
||||
buffer_id,
|
||||
DiffSnapshot {
|
||||
diff: git::diff::BufferDiff::new_with_single_insertion(&base_text),
|
||||
base_text,
|
||||
},
|
||||
);
|
||||
} else {
|
||||
snapshot.diffs.remove(&buffer_id);
|
||||
}
|
||||
|
@ -2316,20 +2355,8 @@ impl MultiBuffer {
|
|||
pub fn add_change_set(&mut self, change_set: Entity<BufferChangeSet>, cx: &mut Context<Self>) {
|
||||
let buffer_id = change_set.read(cx).buffer_id;
|
||||
self.buffer_diff_changed(change_set.clone(), text::Anchor::MIN..text::Anchor::MAX, cx);
|
||||
self.diff_bases.insert(
|
||||
buffer_id,
|
||||
ChangeSetState {
|
||||
_subscription: cx.subscribe(
|
||||
&change_set,
|
||||
|this, change_set, event, cx| match event {
|
||||
BufferChangeSetEvent::DiffChanged { changed_range } => {
|
||||
this.buffer_diff_changed(change_set, changed_range.clone(), cx);
|
||||
}
|
||||
},
|
||||
),
|
||||
change_set,
|
||||
},
|
||||
);
|
||||
self.diff_bases
|
||||
.insert(buffer_id, ChangeSetState::new(change_set, cx));
|
||||
}
|
||||
|
||||
pub fn change_set_for(&self, buffer_id: BufferId) -> Option<Entity<BufferChangeSet>> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue