diff --git a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeViewer.java b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeViewer.java index 3464fd32040b..0cf4d7257e42 100644 --- a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeViewer.java @@ -878,7 +878,8 @@ public class TextMergeViewer implements MergeTool.MergeViewer { } else { return !change.isResolved() && - change.isChange(side); + change.isChange(side) && + !isChangeRangeModified(change); } }); } @@ -903,6 +904,7 @@ public class TextMergeViewer implements MergeTool.MergeViewer { else { if (change.isResolved(side)) return; if (!change.isChange(side)) return; + if (isChangeRangeModified(change)) return; Side masterSide = side.select(Side.LEFT, change.isChange(Side.LEFT) ? Side.LEFT : Side.RIGHT, Side.RIGHT); @@ -1157,7 +1159,8 @@ public class TextMergeViewer implements MergeTool.MergeViewer { return canResolveConflictedChange(change); } else { - return !change.isResolved(); + return !change.isResolved() && + !isChangeRangeModified(change); } } diff --git a/platform/diff-impl/tests/com/intellij/diff/merge/MergeTest.kt b/platform/diff-impl/tests/com/intellij/diff/merge/MergeTest.kt index c1fe8b601049..88c9fd49b069 100644 --- a/platform/diff-impl/tests/com/intellij/diff/merge/MergeTest.kt +++ b/platform/diff-impl/tests/com/intellij/diff/merge/MergeTest.kt @@ -386,6 +386,53 @@ class MergeTest : MergeTestBase() { assertContent("y z_Y_y") } + + test1("y z", "x y z", "x y") { + assertTrue(0.canResolveConflict()) + + replaceText(2, 3, "U") + assertContent("x U z") + + assertFalse(0.canResolveConflict()) + } + + test2("y z_Y_x y", "x y z_Y_x y z", "x y_Y_y z") { + assertTrue(0.canResolveConflict()) + assertTrue(1.canResolveConflict()) + + + replaceText(2, 3, "U") + + assertFalse(0.canResolveConflict()) + assertTrue(1.canResolveConflict()) + assertContent("x U z_Y_x y z") + + + checkUndo(1) { + 1.resolve() + } + 1.assertResolved(BOTH) + 1.assertContent("y") + + assertFalse(0.canResolveConflict()) + assertFalse(1.canResolveConflict()) + assertContent("x U z_Y_y") + + + replaceText(2, 3, "y") + + assertTrue(0.canResolveConflict()) + assertFalse(1.canResolveConflict()) + + + checkUndo(1) { + 0.resolve() + } + + assertFalse(0.canResolveConflict()) + assertFalse(1.canResolveConflict()) + assertContent("y_Y_y") + } } fun testUndoSimple() { @@ -634,5 +681,50 @@ class MergeTest : MergeTestBase() { delete modify 7 ======""".trimIndent()) } + + testN(text1, text2, text3) { + replaceText(!5 - 0, !5 - 0, "USER ") + + checkUndo(1) { + runApplyNonConflictsAction(ThreeSide.BASE) + } + + assertChangesCount(2) + assertContent(""" + 1 ====== + insert left + 2 ====== + 3 ====== + new both + 4 ====== + USER modify + 5 ====== + modify right + 6 ====== + delete modify + 7 ======""".trimIndent()) + } + + testN(text1, text2, text3) { + replaceText(!7 - 0, !7 - 0, "USER ") + + checkUndo(1) { + runApplyNonConflictsAction(ThreeSide.RIGHT) + } + + assertChangesCount(3) + assertContent(""" + 1 ====== + 2 ====== + 3 ====== + new both + 4 ====== + modify both + 5 ====== + USER modify + 6 ====== + delete modify + 7 ======""".trimIndent()) + } } } diff --git a/platform/diff-impl/tests/com/intellij/diff/merge/MergeTestBase.kt b/platform/diff-impl/tests/com/intellij/diff/merge/MergeTestBase.kt index 32eda4e33ca8..b3ebeb42f330 100644 --- a/platform/diff-impl/tests/com/intellij/diff/merge/MergeTestBase.kt +++ b/platform/diff-impl/tests/com/intellij/diff/merge/MergeTestBase.kt @@ -169,6 +169,11 @@ abstract class MergeTestBase : DiffTestCase() { } } + fun Int.canResolveConflict(): Boolean { + val change = change(this) + return viewer.canResolveConflictedChange(change) + } + // // Text modification //