From 121cdf2da3d316fbda3663212a0805012da9cc4f Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 9 Nov 2018 19:06:07 +0300 Subject: [PATCH] revert, because out of range check is already there in getSaveRMTree (for IDEA-CR-39543) --- .../openapi/editor/impl/RangeMarkerTree.java | 32 +++++++------------ .../openapi/editor/impl/FoldingModelImpl.java | 6 ++-- 2 files changed, 15 insertions(+), 23 deletions(-) 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 f0b624ac5a67..fdd81e5038dc 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 @@ -168,8 +168,7 @@ class RangeMarkerTree extends IntervalTreeImpl imple incModCount(); List> affected = new SmartList<>(); - int oldDocumentLength = e.getDocument().getTextLength() + e.getOldLength() - e.getNewLength(); - collectAffectedMarkersAndShiftSubtrees(getRoot(), e, oldDocumentLength, affected); + collectAffectedMarkersAndShiftSubtrees(getRoot(), e, affected); checkMax(false); if (!affected.isEmpty()) { @@ -199,9 +198,6 @@ class RangeMarkerTree extends IntervalTreeImpl imple Getter key = keys.get(i); marker = (RangeMarkerImpl)key.get(); if (marker != null) { - if (marker.isValid() && (marker.getStartOffset() < 0 || marker.getEndOffset() > oldDocumentLength)) { - marker.invalidate(e); - } if (!marker.isValid()) { // marker can become invalid on its own, e.g. FoldRegion node.removeIntervalInternal(i); @@ -224,9 +220,8 @@ class RangeMarkerTree extends IntervalTreeImpl imple } checkMax(true); - // can be false when create lazy range marker from virtual file with invalid (e.g. too large) offset (with no ability to verify the offset at creation time) - //IntervalNode root = getRoot(); - //assert root == null || root.maxEnd + root.delta <= e.getDocument().getTextLength(); + IntervalNode root = getRoot(); + assert root == null || root.maxEnd + root.delta <= e.getDocument().getTextLength(); } finally { l.writeLock().unlock(); @@ -244,8 +239,8 @@ class RangeMarkerTree extends IntervalTreeImpl imple // returns true if all deltas involved are still 0 boolean collectAffectedMarkersAndShiftSubtrees(@Nullable IntervalNode root, - @NotNull DocumentEvent e, int oldDocumentLength, - @NotNull List> affected) { + @NotNull DocumentEvent e, + @NotNull List> affected) { if (root == null) return true; boolean norm = pushDelta(root); @@ -255,11 +250,11 @@ class RangeMarkerTree extends IntervalTreeImpl imple int offset = e.getOffset(); int affectedEndOffset = offset + e.getOldLength(); boolean hasAliveKeys = root.hasAliveKey(false); - if (!hasAliveKeys || root.intervalEnd() > oldDocumentLength) { - // marker was garbage collected or its offsets become invalid (e.g. after loading document for range marker created from virtual file with invalid offsets) + if (!hasAliveKeys) { + // marker was garbage collected affected.add(root); } - if (offset > maxEnd && maxEnd <= oldDocumentLength) { + if (offset > maxEnd) { // no need to bother } else if (affectedEndOffset < root.intervalStart()) { @@ -273,21 +268,18 @@ class RangeMarkerTree extends IntervalTreeImpl imple norm &= newL == 0; } norm &= pushDelta(root); - norm &= collectAffectedMarkersAndShiftSubtrees(left, e, oldDocumentLength, affected); - if (maxEnd > oldDocumentLength) { - collectAffectedMarkersAndShiftSubtrees(root.getRight(), e, oldDocumentLength, affected); - } + norm &= collectAffectedMarkersAndShiftSubtrees(left, e, affected); correctMax(root, 0); } else { if (offset <= root.intervalEnd()) { // unlucky enough so that change affects the interval - if (affected.isEmpty() || affected.get(affected.size()-1) != root) affected.add(root); // otherwise we've already added it + if (hasAliveKeys) affected.add(root); // otherwise we've already added it root.setValid(false); //make invisible } - norm &= collectAffectedMarkersAndShiftSubtrees(root.getLeft(), e, oldDocumentLength, affected); - norm &= collectAffectedMarkersAndShiftSubtrees(root.getRight(), e, oldDocumentLength, affected); + norm &= collectAffectedMarkersAndShiftSubtrees(root.getLeft(), e, affected); + norm &= collectAffectedMarkersAndShiftSubtrees(root.getRight(), e, affected); correctMax(root,0); } return norm; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index 85acd86ef357..5df5daf8e296 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -754,12 +754,12 @@ public class FoldingModelImpl extends InlayModel.SimpleAdapter @Override boolean collectAffectedMarkersAndShiftSubtrees(@Nullable IntervalNode root, @NotNull DocumentEvent e, - int oldDocumentLength, @NotNull List> affected) { - if (inCollectCall) return super.collectAffectedMarkersAndShiftSubtrees(root, e, oldDocumentLength, affected); + @NotNull List> affected) { + if (inCollectCall) return super.collectAffectedMarkersAndShiftSubtrees(root, e, affected); inCollectCall = true; boolean result; try { - result = super.collectAffectedMarkersAndShiftSubtrees(root, e, oldDocumentLength, affected); + result = super.collectAffectedMarkersAndShiftSubtrees(root, e, affected); } finally { inCollectCall = false;