From 9c2daf694d246c11b20dbe2584eb85e192172658 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 16 Jun 2014 11:49:31 +0400 Subject: [PATCH] diff: fix IDEA-97563 and related issues --- .../openapi/vcs/ex/LineStatusTracker.java | 55 ++++++++++++------- .../vcs/ex/ShowLineStatusRangeDiffAction.java | 4 +- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java index a0fcbd1770e9..d8fd155c366b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java @@ -544,25 +544,34 @@ public class LineStatusTracker { myApplication.assertWriteAccessAllowed(); synchronized (myLock) { - TextRange currentTextRange = getCurrentTextRange(range); + TextRange currentTextRange = getCurrentTextRangeWithMagic(range); if (range.getType() == Range.INSERTED) { myDocument .replaceString(currentTextRange.getStartOffset(), Math.min(currentTextRange.getEndOffset() + 1, myDocument.getTextLength()), ""); } else if (range.getType() == Range.DELETED) { - String upToDateContent = getUpToDateContent(range); + String upToDateContent = getUpToDateContentWithMagic(range); myDocument.insertString(currentTextRange.getStartOffset(), upToDateContent); } else { - String upToDateContent = getUpToDateContent(range); + String upToDateContent = getUpToDateContentWithMagic(range); myDocument.replaceString(currentTextRange.getStartOffset(), Math.min(currentTextRange.getEndOffset() + 1, myDocument.getTextLength()), upToDateContent); } } } + public String getUpToDateContentWithMagic(Range range) { + synchronized (myLock) { + TextRange textRange = getUpToDateRangeWithMagic(range); + final int startOffset = textRange.getStartOffset(); + final int endOffset = Math.min(textRange.getEndOffset() + 1, myUpToDateDocument.getTextLength()); + return myUpToDateDocument.getCharsSequence().subSequence(startOffset, endOffset).toString(); + } + } + public String getUpToDateContent(Range range) { synchronized (myLock) { TextRange textRange = getUpToDateRange(range); @@ -576,25 +585,23 @@ public class LineStatusTracker { return myProject; } + TextRange getCurrentTextRangeWithMagic(Range range) { + return getRangeWithMagic(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument); + } + + TextRange getUpToDateRangeWithMagic(Range range) { + return getRangeWithMagic(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument); + } + TextRange getCurrentTextRange(Range range) { - return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument, false); + return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument); } TextRange getUpToDateRange(Range range) { - return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument, false); + return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument); } - TextRange getCurrentTextRangeWithEndSymbol(Range range) { - return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument, true); - } - - // a hack - TextRange getUpToDateRangeWithEndSymbol(Range range) { - return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument, true); - } - - private static TextRange getRange(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document, - final boolean keepEnd) { + private static TextRange getRangeWithMagic(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document) { if (rangeType == emptyRangeCondition) { int lineStartOffset; if (offset1 == 0) { @@ -612,14 +619,24 @@ public class LineStatusTracker { int endOffset = document.getLineEndOffset(offset2 - 1); if (startOffset > 0) { -- startOffset; - if (! keepEnd) { - -- endOffset; - } + -- endOffset; } return new TextRange(startOffset, endOffset); } } + private static TextRange getRange(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document) { + if (rangeType == emptyRangeCondition) { + int lineStartOffset = offset1 < document.getLineCount() ? document.getLineStartOffset(offset1) : document.getTextLength(); + return new TextRange(lineStartOffset, lineStartOffset); + } + else { + int startOffset = document.getLineStartOffset(offset1); + int endOffset = document.getLineEndOffset(offset2 - 1); + return new TextRange(startOffset, endOffset); + } + } + public static LineStatusTracker createOn(@Nullable VirtualFile virtualFile, final Document doc, final Project project) { final Document document = new DocumentImpl("",true); return new LineStatusTracker(doc, document, project, virtualFile); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java index 50622b27d0ce..c5dba0cab29c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java @@ -56,10 +56,10 @@ public class ShowLineStatusRangeDiffAction extends BaseLineStatusRangeAction { public DiffContent[] getContents() { return new DiffContent[]{ createDiffContent(myLineStatusTracker.getUpToDateDocument(), - myLineStatusTracker.getUpToDateRangeWithEndSymbol(myRange), + myLineStatusTracker.getUpToDateRange(myRange), null), createDiffContent(myLineStatusTracker.getDocument(), - myLineStatusTracker.getCurrentTextRangeWithEndSymbol(myRange), + myLineStatusTracker.getCurrentTextRange(myRange), myLineStatusTracker.getVirtualFile())}; }