@@ -263,7 +263,7 @@ export class LcsDiff {
263263 // We have to clean up the computed diff to be more intuitive
264264 // but it turns out this cannot be done correctly until the entire set
265265 // of diffs have been computed
266- return this . ShiftChanges ( changes ) ;
266+ return this . PrettifyChanges ( changes ) ;
267267 }
268268
269269 return changes ;
@@ -746,45 +746,32 @@ export class LcsDiff {
746746 * @param changes The list of changes to shift
747747 * @returns The shifted changes
748748 */
749- private ShiftChanges ( changes : DiffChange [ ] ) : DiffChange [ ] {
750- let mergedDiffs : boolean ;
751- do {
752- mergedDiffs = false ;
753-
754- // Shift all the changes down first
755- for ( let i = 0 ; i < changes . length ; i ++ ) {
756- const change = changes [ i ] ;
757- const originalStop = ( i < changes . length - 1 ) ? changes [ i + 1 ] . originalStart : this . OriginalSequence . getLength ( ) ;
758- const modifiedStop = ( i < changes . length - 1 ) ? changes [ i + 1 ] . modifiedStart : this . ModifiedSequence . getLength ( ) ;
759- const checkOriginal = change . originalLength > 0 ;
760- const checkModified = change . modifiedLength > 0 ;
761-
762- while ( change . originalStart + change . originalLength < originalStop &&
763- change . modifiedStart + change . modifiedLength < modifiedStop &&
764- ( ! checkOriginal || this . OriginalElementsAreEqual ( change . originalStart , change . originalStart + change . originalLength ) ) &&
765- ( ! checkModified || this . ModifiedElementsAreEqual ( change . modifiedStart , change . modifiedStart + change . modifiedLength ) ) ) {
766- change . originalStart ++ ;
767- change . modifiedStart ++ ;
768- }
749+ private PrettifyChanges ( changes : DiffChange [ ] ) : DiffChange [ ] {
750+
751+ // Shift all the changes down first
752+ for ( let i = 0 ; i < changes . length ; i ++ ) {
753+ const change = changes [ i ] ;
754+ const originalStop = ( i < changes . length - 1 ) ? changes [ i + 1 ] . originalStart : this . OriginalSequence . getLength ( ) ;
755+ const modifiedStop = ( i < changes . length - 1 ) ? changes [ i + 1 ] . modifiedStart : this . ModifiedSequence . getLength ( ) ;
756+ const checkOriginal = change . originalLength > 0 ;
757+ const checkModified = change . modifiedLength > 0 ;
758+
759+ while ( change . originalStart + change . originalLength < originalStop &&
760+ change . modifiedStart + change . modifiedLength < modifiedStop &&
761+ ( ! checkOriginal || this . OriginalElementsAreEqual ( change . originalStart , change . originalStart + change . originalLength ) ) &&
762+ ( ! checkModified || this . ModifiedElementsAreEqual ( change . modifiedStart , change . modifiedStart + change . modifiedLength ) ) ) {
763+ change . originalStart ++ ;
764+ change . modifiedStart ++ ;
769765 }
770766
771- // Build up the new list (we have to build a new list because we
772- // might have changes we can merge together now)
773- let result = new Array < DiffChange > ( ) ;
774767 let mergedChangeArr : DiffChange [ ] = [ null ] ;
775- for ( let i = 0 ; i < changes . length ; i ++ ) {
776- if ( i < changes . length - 1 && this . ChangesOverlap ( changes [ i ] , changes [ i + 1 ] , mergedChangeArr ) ) {
777- mergedDiffs = true ;
778- result . push ( mergedChangeArr [ 0 ] ) ;
779- i ++ ;
780- }
781- else {
782- result . push ( changes [ i ] ) ;
783- }
768+ if ( i < changes . length - 1 && this . ChangesOverlap ( changes [ i ] , changes [ i + 1 ] , mergedChangeArr ) ) {
769+ changes [ i ] = mergedChangeArr [ 0 ] ;
770+ changes . splice ( i + 1 , 1 ) ;
771+ i -- ;
772+ continue ;
784773 }
785-
786- changes = result ;
787- } while ( mergedDiffs ) ;
774+ }
788775
789776 // Shift changes back up until we hit empty or whitespace-only lines
790777 for ( let i = changes . length - 1 ; i >= 0 ; i -- ) {
0 commit comments