mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
removed inheritance on MutableInterval as problematic and highly impl-dependent
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user