diff --git a/services/web/public/coffee/ide/review-panel/ChangesTracker.coffee b/services/web/public/coffee/ide/review-panel/ChangesTracker.coffee index 1ea9852ab1..dc1adb7885 100644 --- a/services/web/public/coffee/ide/review-panel/ChangesTracker.coffee +++ b/services/web/public/coffee/ide/review-panel/ChangesTracker.coffee @@ -148,15 +148,29 @@ define [ already_merged = false previous_change = null moved_changes = [] + remove_changes = [] new_changes = [] for change in @changes change_start = change.op.p if change.op.d? # Shift any deletes after this along by the length of this insert - if op_start <= change_start + if op_start < change_start change.op.p += op_length moved_changes.push change + else if op_start == change_start + # If the insert matches the start of the delete, just remove it from the delete instead + if change.op.d.length >= op.i.length and change.op.d.slice(0, op.i.length) == op.i + change.op.d = change.op.d.slice(op.i.length) + change.op.p += op.i.length + if change.op.d == "" + remove_changes.push change + else + moved_changes.push change + already_merged = true + else + change.op.p += op_length + moved_changes.push change else if change.op.i? change_end = change_start + change.op.i.length is_change_overlapping = (op_start >= change_start and op_start <= change_end) @@ -227,6 +241,9 @@ define [ @_addOp op, metadata for {op, metadata} in new_changes @_addOp op, metadata + + for change in remove_changes + @_removeChange change if moved_changes.length > 0 @emit "changes:moved", moved_changes