Ensure slider correction sets the opposite node on both sides

Fixes #154
pull/166/head
Wilfred Hughes 2022-03-13 21:23:58 +07:00
parent 19d11951ce
commit 8c469e3d36
2 changed files with 9 additions and 2 deletions

@ -7,6 +7,9 @@ Improved performance on very large files that are compared by text.
Fixed some cases where changing list delimiters would lead to Fixed some cases where changing list delimiters would lead to
incorrect diffs. incorrect diffs.
Fixed an issue where lines were not aligned correctly after correcting
sliders.
## 0.22 (release 10th March 2022) ## 0.22 (release 10th March 2022)
Difftastic now requires Rust 1.56 to build. Difftastic now requires Rust 1.56 to build.

@ -182,7 +182,7 @@ fn is_unchanged_deep(node: &Syntax) -> bool {
} }
} }
fn slide_to_prev_node(nodes: &[&Syntax], start_idx: usize, end_idx: usize) { fn slide_to_prev_node<'a>(nodes: &[&'a Syntax<'a>], start_idx: usize, end_idx: usize) {
if start_idx == 0 { if start_idx == 0 {
return; return;
} }
@ -225,10 +225,11 @@ fn slide_to_prev_node(nodes: &[&Syntax], start_idx: usize, end_idx: usize) {
before_start_node.set_change_deep(Novel); before_start_node.set_change_deep(Novel);
last_node.set_change_deep(Unchanged(opposite)); last_node.set_change_deep(Unchanged(opposite));
opposite.set_change_deep(Unchanged(last_node));
} }
} }
fn slide_to_next_node(nodes: &[&Syntax], start_idx: usize, end_idx: usize) { fn slide_to_next_node<'a>(nodes: &[&'a Syntax<'a>], start_idx: usize, end_idx: usize) {
if end_idx == nodes.len() - 1 { if end_idx == nodes.len() - 1 {
return; return;
} }
@ -270,6 +271,7 @@ fn slide_to_next_node(nodes: &[&Syntax], start_idx: usize, end_idx: usize) {
}; };
start_node.set_change_deep(Unchanged(opposite)); start_node.set_change_deep(Unchanged(opposite));
opposite.set_change_deep(Unchanged(start_node));
after_last_node.set_change_deep(Novel); after_last_node.set_change_deep(Novel);
} }
} }
@ -395,6 +397,7 @@ mod tests {
assert_eq!(lhs[0].change(), Some(Novel)); assert_eq!(lhs[0].change(), Some(Novel));
assert_eq!(lhs[1].change(), Some(Novel)); assert_eq!(lhs[1].change(), Some(Novel));
assert_eq!(lhs[2].change(), Some(Unchanged(rhs[0]))); assert_eq!(lhs[2].change(), Some(Unchanged(rhs[0])));
assert_eq!(rhs[0].change(), Some(Unchanged(lhs[2])));
} }
/// Test that we slide at the end if the unchanged node is /// Test that we slide at the end if the unchanged node is
@ -439,6 +442,7 @@ mod tests {
lhs[2].set_change(Unchanged(rhs[0])); lhs[2].set_change(Unchanged(rhs[0]));
fix_all_sliders(&lhs); fix_all_sliders(&lhs);
assert_eq!(rhs[0].change(), Some(Unchanged(lhs[0])));
assert_eq!(lhs[0].change(), Some(Unchanged(rhs[0]))); assert_eq!(lhs[0].change(), Some(Unchanged(rhs[0])));
assert_eq!(lhs[1].change(), Some(Novel)); assert_eq!(lhs[1].change(), Some(Novel));
assert_eq!(lhs[2].change(), Some(Novel)); assert_eq!(lhs[2].change(), Some(Novel));