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 d4935922453a..4c95033ed1bb 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 @@ -526,10 +526,10 @@ public class LineStatusTracker { return Collections.emptyList(); } if (changedLine1 == changedLine2) { - return Collections.singletonList(new Range(changedLine1, changedLine2, vcsLine1, vcsLine2, Range.DELETED)); + return Collections.singletonList(new Range(changedLine1, changedLine2, vcsLine1, vcsLine2)); } if (vcsLine1 == vcsLine2) { - return Collections.singletonList(new Range(changedLine1, changedLine2, vcsLine1, vcsLine2, Range.INSERTED)); + return Collections.singletonList(new Range(changedLine1, changedLine2, vcsLine1, vcsLine2)); } List lines = new DocumentWrapper(myDocument).getLines(changedLine1, changedLine2 - 1); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/Range.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/Range.java index 69884fe22ae1..1840022ce0d2 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/Range.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/Range.java @@ -18,16 +18,11 @@ package com.intellij.openapi.vcs.ex; import com.intellij.diff.util.DiffUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.intellij.util.diff.Diff; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -/** - * author: lesya - */ public class Range { private static final Logger LOG = Logger.getInstance(Range.class); public static final byte EQUAL = 0; @@ -42,81 +37,64 @@ public class Range { private int myLine2; private final int myVcsLine1; private final int myVcsLine2; - private final byte myType; - @Nullable private RangeHighlighter myRangeHighlighter; @Nullable private final List myInnerRanges; + @Nullable private RangeHighlighter myRangeHighlighter; private boolean myValid = true; public Range(@NotNull Range range) { - this(range.getLine1(), range.getLine2(), range.getVcsLine1(), range.getVcsLine2(), range.getType()); + this(range.getLine1(), range.getLine2(), range.getVcsLine1(), range.getVcsLine2()); } - public Range(int line1, int line2, int vcsLine1, int vcsLine2, byte type) { - this(line1, line2, vcsLine1, vcsLine2, type, null); + public Range(int line1, int line2, int vcsLine1, int vcsLine2) { + this(line1, line2, vcsLine1, vcsLine2, null); } - public Range(int line1, int line2, int vcsLine1, int vcsLine2, byte type, @Nullable List innerRanges) { + public Range(int line1, int line2, int vcsLine1, int vcsLine2, @Nullable List innerRanges) { + assert line1 != line2 || vcsLine1 != vcsLine2; + myLine1 = line1; myLine2 = line2; myVcsLine1 = vcsLine1; myVcsLine2 = vcsLine2; - myType = type; myInnerRanges = innerRanges; } public int hashCode() { - return myVcsLine1 ^ myVcsLine2 ^ myType ^ myLine1 ^ myLine2; + return myVcsLine1 ^ myVcsLine2 ^ myLine1 ^ myLine2; } - public boolean equals(Object object) { - if (!(object instanceof Range)) return false; - Range other = (Range)object; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - if (myInnerRanges != null) { - if (other.myInnerRanges == null) return false; - if (myInnerRanges.size() != other.myInnerRanges.size()) return false; + Range range = (Range)o; - for (int i = 0; i < myInnerRanges.size(); i++) { - if (!myInnerRanges.get(i).equals(other.myInnerRanges.get(i))) return false; - } - } - else { - if (other.myInnerRanges != null) return false; + if (myLine1 != range.myLine1) return false; + if (myLine2 != range.myLine2) return false; + if (myVcsLine1 != range.myVcsLine1) return false; + if (myVcsLine2 != range.myVcsLine2) return false; + + if (myInnerRanges == null) return range.myInnerRanges == null; + if (range.myInnerRanges == null) return false; + + if (myInnerRanges.size() != range.myInnerRanges.size()) return false; + for (int i = 0; i < myInnerRanges.size(); i++) { + if (!myInnerRanges.get(i).equals(range.myInnerRanges.get(i))) return false; } - return - (myVcsLine1 == other.myVcsLine1) - && (myVcsLine2 == other.myVcsLine2) - && (myLine1 == other.myLine1) - && (myLine2 == other.myLine2) - && (myType == other.myType); + return true; } public String toString() { - return String.format("%s, %s, %s, %s, %s", myLine1, myLine2, myVcsLine1, myVcsLine2, getTypeName()); - } - - @NonNls - private String getTypeName() { - switch (myType) { - case MODIFIED: - return "MODIFIED"; - case INSERTED: - return "INSERTED"; - case DELETED: - return "DELETED"; - } - return "UNKNOWN"; + return String.format("%s, %s, %s, %s", myLine1, myLine2, myVcsLine1, myVcsLine2); } public byte getType() { - return myType; - } - - public int getUpToDateRangeLength() { - return myVcsLine2 - myVcsLine1; + if (myLine1 == myLine2) return DELETED; + if (myVcsLine1 == myVcsLine2) return INSERTED; + return MODIFIED; } public void shift(int shift) { @@ -151,15 +129,11 @@ public class Range { return myVcsLine2; } - public boolean rightBefore(@NotNull Range range) { - return myLine2 == range.myLine1; - } - public boolean hasHighlighter() { return myRangeHighlighter != null; } - public void setHighlighter(RangeHighlighter highlighter) { + public void setHighlighter(@Nullable RangeHighlighter highlighter) { myRangeHighlighter = highlighter; } @@ -211,8 +185,8 @@ public class Range { InnerRange range = (InnerRange)o; - if (myLine2 != range.myLine2) return false; if (myLine1 != range.myLine1) return false; + if (myLine2 != range.myLine2) return false; if (myType != range.myType) return false; return true; @@ -227,22 +201,7 @@ public class Range { } public String toString() { - return String.format("%s, %s, %s", myLine1, myLine2, getTypeName()); - } - - @NonNls - private String getTypeName() { - switch (myType) { - case MODIFIED: - return "MODIFIED"; - case INSERTED: - return "INSERTED"; - case DELETED: - return "DELETED"; - case EQUAL: - return "EQUAL"; - } - return "UNKNOWN"; + return String.format("%s, %s, %s", myLine1, myLine2, getTypeName(myType)); } } @@ -252,4 +211,19 @@ public class Range { public boolean isSelectedByLine(int line) { return DiffUtil.isSelectedByLine(line, myLine1, myLine2); } + + @NotNull + private static String getTypeName(byte type) { + switch (type) { + case MODIFIED: + return "MODIFIED"; + case INSERTED: + return "INSERTED"; + case DELETED: + return "DELETED"; + case EQUAL: + return "EQUAL"; + } + return "UNKNOWN(" + type + ")"; + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/RangesBuilder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/RangesBuilder.java index ccb5b3390a30..18cf26ec9be1 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/RangesBuilder.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/RangesBuilder.java @@ -101,15 +101,13 @@ public class RangesBuilder { } private static Range createOn(@NotNull Diff.Change change, int shift, int vcsShift) { - byte type = getChangeType(change); - int offset1 = shift + change.line1; int offset2 = offset1 + change.inserted; int uOffset1 = vcsShift + change.line0; int uOffset2 = uOffset1 + change.deleted; - return new Range(offset1, offset2, uOffset1, uOffset2, type); + return new Range(offset1, offset2, uOffset1, uOffset2); } private static Range createOnSmart(@NotNull Diff.Change change, @@ -126,7 +124,7 @@ public class RangesBuilder { int uOffset2 = uOffset1 + change.deleted; if (type != Range.MODIFIED) { - return new Range(offset1, offset2, uOffset1, uOffset2, type, Collections.singletonList(new Range.InnerRange(offset1, offset2, type))); + return new Range(offset1, offset2, uOffset1, uOffset2, Collections.singletonList(new Range.InnerRange(offset1, offset2, type))); } LineWrapper[] lines1 = new LineWrapper[change.deleted]; @@ -169,7 +167,7 @@ public class RangesBuilder { inner.add(new Range.InnerRange(innerStart, innerEnd, innerType)); } - return new Range(offset1, offset2, uOffset1, uOffset2, type, inner); + return new Range(offset1, offset2, uOffset1, uOffset2, inner); } private static byte getChangeType(@NotNull Diff.Change change) { 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 ffb1b7c29ea3..67ba09038d7f 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 @@ -80,6 +80,6 @@ public class ShowLineStatusRangeDiffAction extends BaseLineStatusRangeAction { int uOffset1 = range.getVcsLine1() - (canExpandBefore ? 1 : 0); int offset2 = range.getLine2() + (canExpandAfter ? 1 : 0); int uOffset2 = range.getVcsLine2() + (canExpandAfter ? 1 : 0); - return new Range(offset1, offset2, uOffset1, uOffset2, range.getType()); + return new Range(offset1, offset2, uOffset1, uOffset2); } } \ No newline at end of file diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/UpToDateLineNumberProviderImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/UpToDateLineNumberProviderImpl.java index 5d049f3e9c14..19f28961b96a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/UpToDateLineNumberProviderImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/UpToDateLineNumberProviderImpl.java @@ -44,7 +44,7 @@ public class UpToDateLineNumberProviderImpl implements UpToDateLineNumberProvide } return calcLineNumber(tracker, currentNumber); } - + public boolean isRangeChanged(final int start, final int end) { LineStatusTracker tracker = LineStatusTrackerManager.getInstance(myProject).getLineStatusTracker(myDocument); if (tracker == null) { @@ -60,7 +60,7 @@ public class UpToDateLineNumberProviderImpl implements UpToDateLineNumberProvide } return false; } - + private static boolean lineInRange(final Range range, final int currentNumber) { return range.getLine1() <= currentNumber && range.getLine2() >= currentNumber; } @@ -106,23 +106,23 @@ public class UpToDateLineNumberProviderImpl implements UpToDateLineNumberProvide private static int calcLineNumber(LineStatusTracker tracker, int currentNumber){ if (tracker == null) return -1; - List ranges = tracker.getRanges(); + List ranges = tracker.getRanges(); int result = currentNumber; - for (final Object range1 : ranges) { - Range range = (Range)range1; - int startOffset = range.getLine1(); - int endOffset = range.getLine2(); + for (final Range range : ranges) { + int startLine = range.getLine1(); + int endLine = range.getLine2(); - if ((startOffset <= currentNumber) && (endOffset > currentNumber)) { + if ((startLine <= currentNumber) && (endLine > currentNumber)) { return ABSENT_LINE_NUMBER; } - if (endOffset > currentNumber) return result; + if (endLine > currentNumber) return result; - int currentRangeLength = endOffset - startOffset; + int currentRangeLength = endLine - startLine; + int vcsRangeLength = range.getVcsLine2() - range.getVcsLine1(); - result += range.getUpToDateRangeLength() - currentRangeLength; + result += vcsRangeLength - currentRangeLength; } return result;