859
continue;
860
}
862
863
// Shift changes back up until we hit empty or whitespace-only lines
864
for (let i = changes.length - 1; i >= 0; i--) {
865
>
const change = changes[i];
diff.ts
866
>
867
>
let originalStop = 0;
868
>
let modifiedStop = 0;
869
>
if (i > 0) {
870
const prevChange = changes[i - 1];
871
originalStop = prevChange.originalStart + prevChange.originalLength;
872
modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength;
873
}
875
>
const checkOriginal = change.originalLength > 0;
876
>
const checkModified = change.modifiedLength > 0;
877
>
878
>
let bestDelta = 0;
879
>
let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength);
880
>
881
>
for (let delta = 1; ; delta++) {
882
>
const originalStart = change.originalStart - delta;
883
>
const modifiedStart = change.modifiedStart - delta;
884
>
885
>
if (originalStart < originalStop || modifiedStart < modifiedStop) {
886
break;
887
}
888
889
>
if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) {
diff.ts
890
break;
891
}
892
893
>
if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) {
diff.ts
894
break;
895
}
896
897
const touchingPreviousChange = (originalStart === originalStop && modifiedStart === modifiedStop);
899
>
(touchingPreviousChange ? 5 : 0)
900
>
+ this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength)
901
>
);
902
>
903
>
if (score > bestScore) {
904
bestScore = score;
905
bestDelta = delta;
906
}
908
>
909
>
change.originalStart -= bestDelta;
910
>
change.modifiedStart -= bestDelta;
911
>
912
>
const mergedChangeArr: Array<DiffChange | null> = [null];
913
>
if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) {
914
changes[i - 1] = mergedChangeArr[0]!;
915
changes.splice(i, 1);