MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / convert_word_diff_to_hunks

Function convert_word_diff_to_hunks

atomic-core/src/diff/inline.rs:647–753  ·  view source on GitHub ↗

Convert a word diff result to inline hunks.

(
    old_line: &'a [u8],
    new_line: &'a [u8],
    word_result: &WordDiffResult<'_>,
)

Source from the content-addressed store, hash-verified

645
646/// Convert a word diff result to inline hunks.
647fn 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 ) {

Callers 1

Calls 11

deletedFunction · 0.85
merge_hunksFunction · 0.85
fill_gapsFunction · 0.85
old_tokensMethod · 0.80
new_tokensMethod · 0.80
end_offsetMethod · 0.80
getMethod · 0.65
opsMethod · 0.45
offsetMethod · 0.45
pushMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected