From da8a4c1ee14b8461a80cc8e257c675dc61a42a8c Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Mon, 5 Jul 2021 23:08:52 -0700 Subject: [PATCH] Line up visible lines and include gaps if necessary --- CHANGELOG.md | 2 + img/difftastic.png | Bin 21003 -> 73735 bytes src/lines.rs | 73 ++++++++++++++++------- src/main.rs | 5 +- src/syntax.rs | 141 ++++++++++++++++++++++++++++++++++----------- 5 files changed, 166 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49b5a701c..ebc68b09a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## 0.3 (unreleased) +Diffs are now displayed with unchanged lines aligned to the other side. + Improved Rust parsing to recognise lifetime syntax `'foo`, character literals `'x'` and sequences of punctuation. diff --git a/img/difftastic.png b/img/difftastic.png index 4cbd884cecd9555bc25f64be43396df9d702a851..dc03315e273065d7b365cbd54d887067281d1ced 100644 GIT binary patch literal 73735 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


9W;L=?dYeyCg@G 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 DDcsg{ literal 21003 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 diff --git a/src/lines.rs b/src/lines.rs index c01f77091..86e1dab11 100644 --- a/src/lines.rs +++ b/src/lines.rs @@ -1,7 +1,8 @@ use crate::positions::SingleLineSpan; -use crate::syntax::{MatchKind, MatchedPos}; +use crate::syntax::{aligned_lines, MatchKind, MatchedPos}; use regex::Regex; use std::cmp::{max, min, Ordering}; +use std::collections::HashMap; use std::fmt; use std::ops::RangeInclusive; @@ -43,22 +44,30 @@ impl LineGroup { } } - // We can't iterate over a RangeInclusive in safe, stable Rust. See - // https://github.com/rust-lang/rust/issues/42168 - pub fn iter_lhs_lines(&self) -> RangeInclusive { - let empty_iter = 1usize..=0; + fn lhs_lines(&self) -> Vec { + let mut res = vec![]; match &self.lhs_lines { - Some(lhs_lines) => lhs_lines.start().number..=lhs_lines.end().number, - None => empty_iter, + Some(lhs_lines) => { + for line in lhs_lines.start().number..=lhs_lines.end().number { + res.push(line.into()); + } + } + None => {} } + res } - pub fn iter_rhs_lines(&self) -> RangeInclusive { - let empty_iter = 1usize..=0; + fn rhs_lines(&self) -> Vec { + let mut res = vec![]; match &self.rhs_lines { - Some(rhs_lines) => rhs_lines.start().number..=rhs_lines.end().number, - None => empty_iter, + Some(rhs_lines) => { + for line in rhs_lines.start().number..=rhs_lines.end().number { + res.push(line.into()); + } + } + None => {} } + res } pub fn pad(&mut self, amount: usize, max_lhs_line: LineNumber, max_rhs_line: LineNumber) { @@ -393,25 +402,45 @@ fn apply_group( lhs_lines: &[&str], rhs_lines: &[&str], group: &LineGroup, + lhs_line_matches: &HashMap, lhs_content_width: usize, lhs_column_width: usize, rhs_column_width: usize, ) -> String { let mut lhs_result = String::new(); - for lhs_line_num in group.iter_lhs_lines() { - lhs_result.push_str(&format_line_num_padded(lhs_line_num, lhs_column_width)); + let mut rhs_result = String::new(); - match lhs_lines.get(lhs_line_num) { - Some(line) => lhs_result.push_str(line), - None => lhs_result.push_str(&" ".repeat(lhs_content_width)), + for (lhs_line_num, rhs_line_num) in + aligned_lines(&group.lhs_lines(), &group.rhs_lines(), lhs_line_matches) + { + // TODO: we could build up a single string rather than + // horizontally concatenating afterwards. + + match lhs_line_num { + Some(lhs_line_num) => { + lhs_result.push_str(&format_line_num_padded( + lhs_line_num.number, + lhs_column_width, + )); + lhs_result.push_str(lhs_lines[lhs_line_num.number]); + } + None => { + lhs_result.push_str(&" ".repeat(lhs_column_width)); + lhs_result.push_str(&" ".repeat(lhs_content_width)); + } } lhs_result.push('\n'); - } - let mut rhs_result = String::new(); - for rhs_line_num in group.iter_rhs_lines() { - rhs_result.push_str(&format_line_num_padded(rhs_line_num, rhs_column_width)); - rhs_result.push_str(rhs_lines.get(rhs_line_num).unwrap_or(&"")); + match rhs_line_num { + Some(rhs_line_num) => { + rhs_result.push_str(&format_line_num_padded( + rhs_line_num.number, + rhs_column_width, + )); + rhs_result.push_str(rhs_lines[rhs_line_num.number]); + } + None => {} + } rhs_result.push('\n'); } @@ -429,6 +458,7 @@ pub fn apply_groups( lhs: &str, rhs: &str, groups: &[LineGroup], + lhs_line_matches: &HashMap, lhs_content_width: usize, lhs_column_width: usize, rhs_column_width: usize, @@ -445,6 +475,7 @@ pub fn apply_groups( &lhs_lines, &rhs_lines, group, + lhs_line_matches, lhs_content_width, lhs_column_width, rhs_column_width, diff --git a/src/main.rs b/src/main.rs index e898aad6d..8d0d1d5fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ use crate::lines::{ }; use crate::parse::{find_lang, parse, parse_lines, read_or_die, ConfigDir}; use crate::style::apply_colors; -use crate::syntax::{change_positions, set_next}; +use crate::syntax::{change_positions, matching_lines, set_next}; fn term_width() -> Option { term_size::dimensions().map(|(w, _)| w) @@ -91,6 +91,8 @@ fn main() { let lhs_positions = change_positions(&lhs_src, &rhs_src, &lhs); let rhs_positions = change_positions(&rhs_src, &lhs_src, &rhs); + let lhs_matched_lines = matching_lines(&lhs); + let mut groups = visible_groups(&lhs_positions, &rhs_positions); for group in &mut groups { group.pad(3, lhs_src.max_line(), rhs_src.max_line()); @@ -127,6 +129,7 @@ fn main() { &lhs_colored, &rhs_colored, &groups, + &lhs_matched_lines, lhs_content_width, lhs_column_width, rhs_column_width, diff --git a/src/syntax.rs b/src/syntax.rs index cddc2f470..8d897869a 100644 --- a/src/syntax.rs +++ b/src/syntax.rs @@ -3,8 +3,9 @@ use itertools::{EitherOrBoth, Itertools}; use std::cell::Cell; +use std::cmp::min; use std::collections::hash_map::DefaultHasher; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fmt; use std::hash::{Hash, Hasher}; use typed_arena::Arena; @@ -520,6 +521,22 @@ fn change_positions_<'a>( } } +fn zip_pad_shorter(lhs: &[Tx], rhs: &[Ty]) -> Vec<(Option, Option)> { + let mut res = vec![]; + + let mut i = 0; + loop { + match (lhs.get(i), rhs.get(i)) { + (None, None) => break, + (x, y) => res.push((x.map(|v| *v), y.map(|v| *v))), + } + + i += 1; + } + + res +} + /// Given two slices of line positions, return a list of line number /// pairs. If the slices have different lengths, reuse the last item /// from the shorter slice. @@ -555,59 +572,53 @@ pub fn aligned_lines( lhs_lines: &[LineNumber], rhs_lines: &[LineNumber], lhs_line_matches: &HashMap, - rhs_line_matches: &HashMap, ) -> Vec<(Option, Option)> { - // Find RHS lines that we can match up. - let mut lhs_opposite_lines = vec![]; - for lhs_line in lhs_lines { - if let Some(lhs_opposite_line) = lhs_line_matches.get(lhs_line) { - lhs_opposite_lines.push(lhs_opposite_line); - } - } + let mut rhs_lines_available: HashSet<_> = rhs_lines.iter().collect(); - // Find LHS lines that we can match up. - let mut rhs_opposite_lines = vec![]; - for rhs_line in rhs_lines { - if let Some(rhs_opposite_line) = rhs_line_matches.get(rhs_line) { - rhs_opposite_lines.push(rhs_opposite_line); + // For every LHS line, if there is a RHS line that included in + // `rhs_lines` and hasn't yet been paired up, add it to matched_lines. + let mut matched_lines = vec![]; + for lhs_line in lhs_lines { + if let Some(rhs_line) = lhs_line_matches.get(lhs_line) { + if rhs_lines_available.remove(&rhs_line) { + matched_lines.push((lhs_line, rhs_line)); + } } } - // Sanity check: if LHS X matches RHS Y, then RHS Y should match - // LHS X and we should have the same number of opposite lines. - assert_eq!(lhs_opposite_lines.len(), rhs_opposite_lines.len()); - let mut res = vec![]; let mut lhs_i = 0; let mut rhs_i = 0; - // Build a vec of matched lines, padding the unmatched sequences with None. - for (lhs_matched_line, rhs_matched_line) in rhs_opposite_lines - .into_iter() - .zip(lhs_opposite_lines.into_iter()) - { + // Build a vec of matched line tuples. For lines without matches + // (novel lines, empty lines), just match lines up pairwise. Pad + // gaps if one side has more lines. + for (lhs_matched_line, rhs_matched_line) in matched_lines { + let mut lhs_prev_lines = vec![]; while lhs_i < lhs_lines.len() && lhs_lines[lhs_i] < *lhs_matched_line { - res.push((Some(lhs_lines[lhs_i]), None)); + lhs_prev_lines.push(lhs_lines[lhs_i]); lhs_i += 1; } + let mut rhs_prev_lines = vec![]; while rhs_i < rhs_lines.len() && rhs_lines[rhs_i] < *rhs_matched_line { - res.push((None, Some(rhs_lines[rhs_i]))); + rhs_prev_lines.push(rhs_lines[rhs_i]); rhs_i += 1; } - res.push((Some(*lhs_matched_line), Some(*rhs_matched_line))); - } - // If we have trailing unmatched lines on other side, add them now. - while lhs_i < lhs_lines.len() { - res.push((Some(lhs_lines[lhs_i]), None)); + res.extend(zip_pad_shorter(&lhs_prev_lines, &rhs_prev_lines)); + + res.push((Some(*lhs_matched_line), Some(*rhs_matched_line))); lhs_i += 1; - } - while rhs_i < rhs_lines.len() { - res.push((None, Some(rhs_lines[rhs_i]))); rhs_i += 1; } + // Handle unmatched lines after the last match. + res.extend(zip_pad_shorter( + &lhs_lines[min(lhs_i, lhs_lines.len())..], + &rhs_lines[min(rhs_i, rhs_lines.len())..], + )); + res } @@ -675,6 +686,70 @@ mod tests { use pretty_assertions::assert_eq; use AtomKind::Other; + #[test] + fn test_aligned_middle() { + let lhs_lines: Vec = vec![1.into(), 2.into()]; + let rhs_lines: Vec = vec![12.into(), 13.into()]; + + let mut line_matches: HashMap = HashMap::new(); + line_matches.insert(2.into(), 12.into()); + + assert_eq!( + aligned_lines(&lhs_lines, &rhs_lines, &line_matches), + vec![ + (Some(1.into()), None), + (Some(2.into()), Some(12.into())), + (None, Some(13.into())) + ] + ); + } + + #[test] + fn test_aligned_all() { + let lhs_lines: Vec = vec![1.into(), 2.into()]; + let rhs_lines: Vec = vec![11.into(), 12.into()]; + + let mut line_matches: HashMap = HashMap::new(); + line_matches.insert(1.into(), 2.into()); + line_matches.insert(2.into(), 12.into()); + + assert_eq!( + aligned_lines(&lhs_lines, &rhs_lines, &line_matches), + vec![ + (Some(1.into()), Some(11.into())), + (Some(2.into()), Some(12.into())), + ] + ); + } + + #[test] + fn test_aligned_none() { + let lhs_lines: Vec = vec![1.into()]; + let rhs_lines: Vec = vec![11.into()]; + + let line_matches: HashMap = HashMap::new(); + + assert_eq!( + aligned_lines(&lhs_lines, &rhs_lines, &line_matches), + vec![(Some(1.into()), Some(11.into()))] + ); + } + + #[test] + fn test_aligned_line_overlap() { + let lhs_lines: Vec = vec![1.into(), 2.into()]; + let rhs_lines: Vec = vec![11.into()]; + + let mut line_matches: HashMap = HashMap::new(); + line_matches.insert(1.into(), 11.into()); + line_matches.insert(2.into(), 11.into()); + + assert_eq!( + aligned_lines(&lhs_lines, &rhs_lines, &line_matches), + vec![(Some(1.into()), Some(11.into())), (Some(2.into()), None)] + ); + } + /// Ensure that we assign prev_opposite_pos even if the change is on the first node. #[test] fn test_prev_opposite_pos_first_node() {