From 660aed6855c55013cf54c4315a7be73b573e20d8 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 4 Dec 2012 14:57:16 +0400 Subject: [PATCH] EA-28385 - assert: IntervalTreeImpl$IntervalNode.removeIntervalInternal --- .../openapi/editor/impl/IntervalTreeImpl.java | 15 +++++++++++---- .../openapi/editor/impl/RangeMarkerTree.java | 4 +++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java index 46628def5b91..5d124a2da099 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java @@ -52,6 +52,7 @@ public abstract class IntervalTreeImpl extends RedBla private volatile int myStart; private volatile int myEnd; private volatile boolean isValid = true; + private volatile boolean isAttachedToTree; // true if the node is inserted to the tree protected final List> intervals; protected int maxEnd; // max of all intervalEnd()s among all children. protected int delta; // delta of startOffset. getStartOffset() = myStartOffset + Sum of deltas up to root @@ -143,15 +144,19 @@ public abstract class IntervalTreeImpl extends RedBla public void removeIntervalInternal(int i) { intervals.remove(i); - assert myIntervalTree.keySize > 0 : myIntervalTree.keySize; - myIntervalTree.keySize--; + if (isAttachedToTree) { // for detached node, do not update tree node count + assert myIntervalTree.keySize > 0 : myIntervalTree.keySize; + myIntervalTree.keySize--; + } } public void addInterval(@NotNull E interval) { myIntervalTree.assertUnderWriteLock(); intervals.add(createGetter(interval)); - myIntervalTree.keySize++; - myIntervalTree.setNode(interval, this); + if (isAttachedToTree) { // for detached node, do not update tree node count + myIntervalTree.keySize++; + myIntervalTree.setNode(interval, this); + } } protected Getter createGetter(@NotNull E interval) { @@ -719,6 +724,7 @@ public abstract class IntervalTreeImpl extends RedBla onInsertNode(); keySize += node.intervals.size(); insertCase1(node); + node.isAttachedToTree = true; verifyProperties(); deleteNodes(gced); @@ -942,6 +948,7 @@ public abstract class IntervalTreeImpl extends RedBla keySize -= node.intervals.size(); assert keySize >= 0 : keySize; + node.isAttachedToTree = false; } @Override diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java index 2293d8099696..8ef14bf1057c 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java @@ -366,7 +366,7 @@ public class RangeMarkerTree extends IntervalTreeImpl> affected = new ArrayList>(); collectNodesToRetarget(getRoot(), start, end, affected); @@ -379,11 +379,13 @@ public class RangeMarkerTree extends IntervalTreeImpl