removed inheritance on MutableInterval as problematic and highly impl-dependent

This commit is contained in:
Alexey Kudravtsev
2017-05-15 13:51:43 +03:00
parent abe48c40bf
commit 9887620e70
7 changed files with 18 additions and 49 deletions
@@ -15,7 +15,6 @@
*/
package com.intellij.openapi.editor.ex;
import com.intellij.openapi.editor.impl.MutableInterval;
import com.intellij.util.containers.PeekableIterator;
import org.jetbrains.annotations.NotNull;
@@ -55,9 +54,9 @@ public interface MarkupIterator<T> extends PeekableIterator<T> {
};
@NotNull
static <T extends MutableInterval> MarkupIterator<T> mergeIterators(@NotNull final MarkupIterator<T> iterator1,
@NotNull final MarkupIterator<T> iterator2,
@NotNull final Comparator<? super T> comparator) {
static <T> MarkupIterator<T> mergeIterators(@NotNull final MarkupIterator<T> iterator1,
@NotNull final MarkupIterator<T> iterator2,
@NotNull final Comparator<? super T> comparator) {
return new MarkupIterator<T>() {
@Override
public void dispose() {
@@ -18,11 +18,10 @@ package com.intellij.openapi.editor.ex;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.impl.MutableInterval;
import com.intellij.openapi.util.Segment;
import org.jetbrains.annotations.NotNull;
public interface RangeMarkerEx extends RangeMarker, MutableInterval, Segment {
public interface RangeMarkerEx extends RangeMarker, Segment {
void documentChanged(@NotNull DocumentEvent e);
long getId();
@@ -18,7 +18,7 @@ package com.intellij.openapi.editor.impl;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
interface IntervalTree<T extends Interval> {
interface IntervalTree<T> {
boolean process(@NotNull Processor<? super T> processor);
boolean processOverlappingWith(int start, int end, @NotNull Processor<? super T> processor);
boolean processContaining(int offset, @NotNull Processor<? super T> processor);
@@ -19,6 +19,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.impl.ApplicationInfoImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.ex.MarkupIterator;
import com.intellij.openapi.editor.ex.RangeMarkerEx;
import com.intellij.openapi.util.Getter;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
@@ -41,7 +42,7 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<T> implements IntervalTree<T> {
abstract class IntervalTreeImpl<T> extends RedBlackTree<T> implements IntervalTree<T> {
static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.impl.RangeMarkerTree");
static final boolean DEBUG = LOG.isDebugEnabled() || ApplicationManager.getApplication() != null && (ApplicationManager.getApplication().isUnitTestMode() || ApplicationManager.getApplication().isInternal());
private int keySize; // number of all intervals, counting all duplicates, some of them maybe gced
@@ -51,7 +52,7 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
private final ReferenceQueue<T> myReferenceQueue = new ReferenceQueue<>();
private int deadReferenceCount;
static class IntervalNode<E extends MutableInterval> extends RedBlackTree.Node<E> implements MutableInterval {
static class IntervalNode<E> extends RedBlackTree.Node<E> implements MutableInterval {
private volatile int myStart;
private volatile int myEnd;
private static final byte ATTACHED_TO_TREE_FLAG = COLOR_MASK <<1; // true if the node is inserted to the tree
@@ -142,7 +143,7 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
return false;
}
}
assert false: "interval not found: "+key +"; "+ intervals+"; isValid="+key.isValid();
assert false: "interval not found: "+key +"; "+ intervals;
return false;
}
private boolean isAttachedToTree() {
@@ -936,11 +937,11 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
@Override
public boolean removeInterval(@NotNull T interval) {
if (!interval.isValid()) return false;
if (!((RangeMarkerEx)interval).isValid()) return false;
try {
l.writeLock().lock();
modCount++;
if (!interval.isValid()) return false;
if (!((RangeMarkerEx)interval).isValid()) return false;
checkBelongsToTheTree(interval, true);
checkMax(true);
processReferenceQueue();
@@ -1347,7 +1348,7 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
private static final IntervalTreeGuide INTERVAL_TREE_GUIDE_INSTANCE = new IntervalTreeGuide();
@NotNull
private static <T extends MutableInterval> WalkingState.TreeGuide<IntervalNode<T>> getGuide() {
private static <T> WalkingState.TreeGuide<IntervalNode<T>> getGuide() {
//noinspection unchecked
return (WalkingState.TreeGuide)INTERVAL_TREE_GUIDE_INSTANCE;
}
@@ -1363,11 +1364,11 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
// combines iterators for two trees in one using specified comparator
@NotNull
static <T extends MutableInterval> MarkupIterator<T> mergingOverlappingIterator(@NotNull IntervalTreeImpl<T> tree1,
@NotNull TextRangeInterval tree1Range,
@NotNull IntervalTreeImpl<T> tree2,
@NotNull TextRangeInterval tree2Range,
@NotNull Comparator<? super T> comparator) {
static <T> MarkupIterator<T> mergingOverlappingIterator(@NotNull IntervalTreeImpl<T> tree1,
@NotNull TextRangeInterval tree1Range,
@NotNull IntervalTreeImpl<T> tree2,
@NotNull TextRangeInterval tree2Range,
@NotNull Comparator<? super T> comparator) {
MarkupIterator<T> exact = tree1.overlappingIterator(tree1Range);
MarkupIterator<T> lines = tree2.overlappingIterator(tree2Range);
return MarkupIterator.mergeIterators(exact, lines, comparator);
@@ -260,7 +260,6 @@ public class RangeMarkerImpl extends UserDataHolderBase implements RangeMarkerEx
+ (isGreedyToRight() ? "]" : ")") + " " + getId();
}
@Override
public int setIntervalStart(int start) {
if (start < 0) {
LOG.error("Negative start: " + start);
@@ -268,7 +267,6 @@ public class RangeMarkerImpl extends UserDataHolderBase implements RangeMarkerEx
return myNode.setIntervalStart(start);
}
@Override
public int setIntervalEnd(int end) {
if (end < 0) {
LOG.error("Negative end: "+end);
@@ -282,13 +280,11 @@ public class RangeMarkerImpl extends UserDataHolderBase implements RangeMarkerEx
return node != null && node.isValid();
}
@Override
public boolean setValid(boolean value) {
RangeMarkerTree.RMNode node = myNode;
return node == null || node.setValid(value);
}
@Override
public int intervalStart() {
RangeMarkerTree.RMNode node = myNode;
if (node == null) {
@@ -297,7 +293,6 @@ public class RangeMarkerImpl extends UserDataHolderBase implements RangeMarkerEx
return node.intervalStart();
}
@Override
public int intervalEnd() {
RangeMarkerTree.RMNode node = myNode;
if (node == null) {
@@ -85,7 +85,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
@NotNull
@Override
public RMNode<T> addInterval(@NotNull T interval, int start, int end, boolean greedyToLeft, boolean greedyToRight, int layer) {
interval.setValid(true);
((RangeMarkerImpl)interval).setValid(true);
RMNode<T> node = (RMNode<T>)super.addInterval(interval, start, end, greedyToLeft, greedyToRight, layer);
if (DEBUG && node.intervals.size() > DUPLICATE_LIMIT && !ApplicationInfoImpl.isInStressTest() && ApplicationManager.getApplication().isUnitTestMode()) {
@@ -77,11 +77,6 @@ class RangeMarkerWindow implements RangeMarkerEx {
return startOffset <= endOffset && endOffset <= myDocumentWindow.getTextLength();
}
@Override
public boolean setValid(boolean value) {
return myHostMarker.setValid(value);
}
////////////////////////////delegates
@Override
public void setGreedyToLeft(final boolean greedy) {
@@ -126,26 +121,6 @@ class RangeMarkerWindow implements RangeMarkerEx {
return myHostMarker.isGreedyToLeft();
}
@Override
public int intervalStart() {
return getStartOffset();
}
@Override
public int intervalEnd() {
return getEndOffset();
}
@Override
public int setIntervalStart(int start) {
throw new IllegalStateException();
}
@Override
public int setIntervalEnd(int end) {
throw new IllegalStateException();
}
@Override
public void dispose() {
myHostMarker.dispose();