diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/HighlighterList.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/HighlighterList.java index 68fba2652284..a4d0e8bcd8f0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/HighlighterList.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/HighlighterList.java @@ -26,19 +26,30 @@ import java.util.Iterator; import java.util.List; public abstract class HighlighterList { - private final List mySegmentHighlighters = new SortedList(MY_RANGE_COMPARATOR) { + private final SortedList mySegmentHighlighters = new SortedList(MY_RANGE_COMPARATOR) { @Override protected void sort(List delegate) { Iterator it = delegate.iterator(); + boolean needSort = false; + RangeHighlighterImpl lastHighlighter = null; while (it.hasNext()) { RangeHighlighterImpl highlighter = it.next(); if (!highlighter.isValid()) { + needSort = true; it.remove(); } + + if (lastHighlighter != null) { + if (!needSort) needSort = MY_RANGE_COMPARATOR.compare(lastHighlighter, highlighter) > 0; + } + + lastHighlighter = highlighter; } - super.sort(delegate); + if (needSort) { + super.sort(delegate); + } } }; @@ -65,6 +76,7 @@ public abstract class HighlighterList { myDocumentListener = new DocumentAdapter() { public void documentChanged(DocumentEvent e) { myIsDirtied = true; + mySegmentHighlighters.markDirty(); } }; myDoc = doc; diff --git a/platform/util/src/com/intellij/util/containers/SortedList.java b/platform/util/src/com/intellij/util/containers/SortedList.java index 9e915645d95a..f5233320daed 100644 --- a/platform/util/src/com/intellij/util/containers/SortedList.java +++ b/platform/util/src/com/intellij/util/containers/SortedList.java @@ -63,6 +63,10 @@ public class SortedList extends AbstractList{ } } + public void markDirty() { + mySorted = false; + } + protected void sort(List delegate) { Collections.sort(myDelegate, myComparator); }