Convert a word diff result to inline hunks.
(
old_line: &'a [u8],
new_line: &'a [u8],
word_result: &WordDiffResult<'_>,
)
| 645 | |
| 646 | /// Convert a word diff result to inline hunks. |
| 647 | fn convert_word_diff_to_hunks<'a>( |
| 648 | old_line: &'a [u8], |
| 649 | new_line: &'a [u8], |
| 650 | word_result: &WordDiffResult<'_>, |
| 651 | ) -> InlineDiff<'a> { |
| 652 | let mut old_hunks: Vec<ChangeHunk> = Vec::new(); |
| 653 | let mut new_hunks: Vec<ChangeHunk> = Vec::new(); |
| 654 | let mut has_changes = false; |
| 655 | |
| 656 | let old_tokens = word_result.old_tokens(); |
| 657 | let new_tokens = word_result.new_tokens(); |
| 658 | |
| 659 | for op in word_result.ops() { |
| 660 | match op { |
| 661 | WordDiffOp::Equal { |
| 662 | old_range, |
| 663 | new_range, |
| 664 | } => { |
| 665 | // Add unchanged hunks |
| 666 | if let (Some(first_old), Some(last_old)) = ( |
| 667 | old_tokens.get(old_range.start), |
| 668 | old_tokens.get(old_range.end.saturating_sub(1)), |
| 669 | ) { |
| 670 | let start = first_old.offset(); |
| 671 | let end = last_old.end_offset(); |
| 672 | old_hunks.push(ChangeHunk::unchanged(start, end)); |
| 673 | } |
| 674 | |
| 675 | if let (Some(first_new), Some(last_new)) = ( |
| 676 | new_tokens.get(new_range.start), |
| 677 | new_tokens.get(new_range.end.saturating_sub(1)), |
| 678 | ) { |
| 679 | let start = first_new.offset(); |
| 680 | let end = last_new.end_offset(); |
| 681 | new_hunks.push(ChangeHunk::unchanged(start, end)); |
| 682 | } |
| 683 | } |
| 684 | |
| 685 | WordDiffOp::Insert { new_range, .. } => { |
| 686 | has_changes = true; |
| 687 | |
| 688 | if let (Some(first), Some(last)) = ( |
| 689 | new_tokens.get(new_range.start), |
| 690 | new_tokens.get(new_range.end.saturating_sub(1)), |
| 691 | ) { |
| 692 | let start = first.offset(); |
| 693 | let end = last.end_offset(); |
| 694 | new_hunks.push(ChangeHunk::inserted(start, end)); |
| 695 | } |
| 696 | } |
| 697 | |
| 698 | WordDiffOp::Delete { old_range, .. } => { |
| 699 | has_changes = true; |
| 700 | |
| 701 | if let (Some(first), Some(last)) = ( |
| 702 | old_tokens.get(old_range.start), |
| 703 | old_tokens.get(old_range.end.saturating_sub(1)), |
| 704 | ) { |
no test coverage detected