some more assertions dbe/171.1015
authorAlexey Kudravtsev <cdr@intellij.com>
Wed, 16 Nov 2016 11:07:25 +0000 (14:07 +0300)
committerAlexey Kudravtsev <cdr@intellij.com>
Wed, 16 Nov 2016 11:07:25 +0000 (14:07 +0300)
platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java
platform/core-impl/src/com/intellij/openapi/editor/impl/LineSet.java
platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java
platform/core-impl/src/com/intellij/psi/impl/smartPointers/MarkerCache.java

index 3b601125e8fc07fd499096e6da77c428f8b4fd39..30ff377de7f7f28dcb9fba0a96311832e3e6e4fb 100644 (file)
@@ -387,8 +387,8 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
   @Override
   public RangeMarker getRangeGuard(int start, int end) {
     for (RangeMarker block : myGuardedBlocks) {
-      if (rangesIntersect(start, true, block.getStartOffset(), block.isGreedyToLeft(), end, true, block.getEndOffset(),
-                          block.isGreedyToRight())) {
+      if (rangesIntersect(start, end, true, true,
+                          block.getStartOffset(), block.getEndOffset(), block.isGreedyToLeft(), block.isGreedyToRight())) {
         return block;
       }
     }
@@ -411,15 +411,13 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
     return start <= offset && offset < end;
   }
 
-  private static boolean rangesIntersect(int start0, boolean leftInclusive0,
-                                         int start1, boolean leftInclusive1,
-                                         int end0, boolean rightInclusive0,
-                                         int end1, boolean rightInclusive1) {
-    if (start0 > start1 || start0 == start1 && !leftInclusive0) {
-      if (end1 == start0) return leftInclusive0 && rightInclusive1;
+  private static boolean rangesIntersect(int start0, int end0, boolean start0Inclusive, boolean end0Inclusive,
+                                         int start1, int end1, boolean start1Inclusive, boolean end1Inclusive) {
+    if (start0 > start1 || start0 == start1 && !start0Inclusive) {
+      if (end1 == start0) return start0Inclusive && end1Inclusive;
       return end1 > start0;
     }
-    if (end0 == start1) return leftInclusive1 && rightInclusive0;
+    if (end0 == start1) return start1Inclusive && end0Inclusive;
     return end0 > start1;
   }
 
@@ -558,7 +556,6 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
     final int newStringLength = s.length();
     final CharSequence chars = myText;
     int newStartInString = 0;
-    int newEndInString = newStringLength;
     while (newStartInString < newStringLength &&
            startOffset < endOffset &&
            s.charAt(newStartInString) == chars.charAt(startOffset)) {
@@ -566,6 +563,7 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
       newStartInString++;
     }
 
+    int newEndInString = newStringLength;
     while (endOffset > startOffset &&
            newEndInString > newStartInString &&
            s.charAt(newEndInString - 1) == chars.charAt(endOffset - 1)) {
@@ -643,14 +641,14 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
    * </ol>
    * </pre>
    * <p/>
-   * There is a possible case that <code>'before change'</code> notification produces new change. We have a problem then - imagine
-   * that initial change was <code>'replace particular range at document end'</code> and <code>'nested change'</code> was to
-   * <code>'remove text at document end'</code>. That means that when initial change will be actually performed, the document may be
+   * There is a possible case that {@code 'before change'} notification produces new change. We have a problem then - imagine
+   * that initial change was {@code 'replace particular range at document end'} and {@code 'nested change'} was to
+   * {@code 'remove text at document end'}. That means that when initial change will be actually performed, the document may be
    * not long enough to contain target range.
    * <p/>
-   * Current method allows to check if document change is a <code>'nested call'</code>.
+   * Current method allows to check if document change is a {@code 'nested call'}.
    *
-   * @throws IllegalStateException if this method is called during a <code>'nested document modification'</code>
+   * @throws IllegalStateException if this method is called during a {@code 'nested document modification'}
    */
   private void assertNotNestedModification() throws IllegalStateException {
     if (myChangeInProgress) {
@@ -777,7 +775,13 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
     try {
       if (LOG.isDebugEnabled()) LOG.debug(event.toString());
 
+      assert event.getOldFragment().length() ==  event.getOldLength() : "event.getOldFragment().length() = " + event.getOldFragment().length()+"; event.getOldLength() = " + event.getOldLength();
+      assert event.getNewFragment().length() ==  event.getNewLength() : "event.getNewFragment().length() = " + event.getNewFragment().length()+"; event.getNewLength() = " + event.getNewLength();
+      assert prevText.length() + event.getNewLength() - event.getOldLength() == getTextLength() : "prevText.length() = " + prevText.length()+ "; event.getNewLength() = " + event.getNewLength()+ "; event.getOldLength() = " + event.getOldLength()+ "; getTextLength() = " + getTextLength();
+
       myLineSet = getLineSet().update(prevText, event.getOffset(), event.getOffset() + event.getOldLength(), event.getNewFragment(), event.isWholeTextReplaced());
+      assert getTextLength() == myLineSet.getLength() : "getTextLength() = " + getTextLength()+ "; myLineSet.getLength() = " + myLineSet.getLength();
+
       myFrozen = null;
       if (myTabTrackingRequestors > 0) {
         updateMightContainTabs(event.getNewFragment());
index b4033a107c84f2548ced44d8c97febd346d61295..282978a7c7658d4f4d0258d9caf41e21a04e160f 100644 (file)
@@ -71,7 +71,7 @@ public class LineSet{
       return createLineSet(replacement, !wholeTextReplaced);
     }
 
-    LineSet result = isSingleLineChange(prevText, start, end, replacement)
+    LineSet result = isSingleLineChange(start, end, replacement)
                      ? updateInsideOneLine(findLineIndex(start), replacement.length() - (end - start))
                      : genericUpdate(prevText, start, end, replacement);
 
@@ -84,7 +84,7 @@ public class LineSet{
     return wholeTextReplaced ? result.clearModificationFlags() : result;
   }
 
-  private boolean isSingleLineChange(@NotNull CharSequence prevText, int start, int end, @NotNull CharSequence replacement) {
+  private boolean isSingleLineChange(int start, int end, @NotNull CharSequence replacement) {
     if (start == 0 && end == myLength && replacement.length() == 0) return false;
 
     int startLine = findLineIndex(start);
@@ -256,6 +256,9 @@ public class LineSet{
     doTest = testMode;
   }
 
-  private static boolean doTest = false;
+  private static boolean doTest;
 
+  int getLength() {
+    return myLength;
+  }
 }
index 4ee1dc2e7324b4477e94bea84d62b1dab603de81..b556a63f62e6fb1c6e0aa209af584dc7c9229412 100644 (file)
@@ -31,8 +31,7 @@ public class DocumentEventImpl extends DocumentEvent {
   private final long myOldTimeStamp;
   private final boolean myIsWholeDocReplaced;
   private Diff.Change myChange;
-  private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null) {
-  };
+  private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null);
 
   private final int myInitialStartOffset;
   private final int myInitialOldLength;
@@ -68,6 +67,9 @@ public class DocumentEventImpl extends DocumentEvent {
     myOldTimeStamp = oldTimeStamp;
 
     myIsWholeDocReplaced = getDocument().getTextLength() != 0 && wholeTextReplaced;
+    assert initialStartOffset >= 0 : initialStartOffset;
+    assert initialOldLength >= 0 : initialOldLength;
+    assert initialStartOffset+initialOldLength <= document.getTextLength() : "initialStartOffset = " + initialStartOffset + "; initialOldLength = " + initialOldLength+";document.getTextLength() = " + document.getTextLength();
   }
 
   @Override
index 018bd8c12e86cdd8bcdaf34ecd64a9cb46b76a06..05bc1cf7261e7d3b45f45e2cd7bcfd9bbb50ed3f 100644 (file)
@@ -107,15 +107,15 @@ class MarkerCache {
     for (DocumentEvent event : events) {
       final FrozenDocument before = frozen;
       final DocumentEvent corrected;
-      if ((event instanceof RetargetRangeMarkers)) {
+      if (event instanceof RetargetRangeMarkers) {
         RetargetRangeMarkers retarget = (RetargetRangeMarkers)event;
         corrected = new RetargetRangeMarkers(frozen, retarget.getStartOffset(), retarget.getEndOffset(), retarget.getMoveDestinationOffset());
       }
       else {
-        frozen = frozen.applyEvent(event, 0);
         corrected = new DocumentEventImpl(frozen, event.getOffset(), event.getOldFragment(), event.getNewFragment(), event.getOldTimeStamp(),
                                           event.isWholeTextReplaced(),
                                           ((DocumentEventImpl) event).getInitialStartOffset(), ((DocumentEventImpl) event).getInitialOldLength());
+        frozen = frozen.applyEvent(event, 0);
       }
 
       int i = 0;