From 350951517bd688c3135e0fe3de9c1cb133fde27e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 28 Sep 2010 15:57:58 +0400 Subject: [PATCH 1/2] exception --- .../codeInsight/daemon/impl/VisibleHighlightingPassFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/VisibleHighlightingPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/VisibleHighlightingPassFactory.java index 1b2a01232de7..b3792c3bd1cd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/VisibleHighlightingPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/VisibleHighlightingPassFactory.java @@ -46,7 +46,7 @@ public abstract class VisibleHighlightingPassFactory extends AbstractProjectComp int visibleEnd = editor.logicalPositionToOffset(new LogicalPosition(endPosition.line + 1, 0)); - return new ProperTextRange(visibleStart, visibleEnd); + return new ProperTextRange(visibleStart, Math.max(visibleEnd, visibleStart)); } @Nullable From 851fa251a2632976b093a4e7c250858237184b78 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 28 Sep 2010 18:20:16 +0400 Subject: [PATCH 2/2] WI-3229 --- .../daemon/impl/StatusBarUpdater.java | 2 +- .../openapi/editor/impl/DocumentImpl.java | 7 ++++ .../openapi/editor/impl/IntervalTreeImpl.java | 39 ++++++++++++++----- .../openapi/editor/impl/MarkupModelImpl.java | 4 +- .../openapi/editor/impl/RangeMarkerTree.java | 2 + 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java index 47bb6a7ec4fd..dddcb961b6d8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java @@ -72,7 +72,7 @@ public class StatusBarUpdater implements Disposable { public void dispose() { } - public void updateStatus() { + private void updateStatus() { Editor editor = FileEditorManager.getInstance(myProject).getSelectedTextEditor(); if (editor == null || !editor.getContentComponent().hasFocus()){ return; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java index 02df5da54ed7..b1e5f2cd43c9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java @@ -777,6 +777,13 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx { public void normalizeRangeMarkers() { myRangeMarkers.normalize(); + + MarkupModel model = getMarkupModel(null, false); + if (model != null) ((MarkupModelImpl)model).normalize(); + + for (MarkupModel markupModel : myProjectToMarkupModelMap.values()) { + ((MarkupModelImpl)markupModel).normalize(); + } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java index ac3619556ac6..85349fc9ab64 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java @@ -137,6 +137,7 @@ public abstract class IntervalTreeImpl extends RedBla public boolean process(@NotNull Processor processor) { try { + normalize(); l.readLock().lock(); checkMax(true); return process(getRoot(), processor, modCount); @@ -146,7 +147,7 @@ public abstract class IntervalTreeImpl extends RedBla } } - protected boolean process(Node root, Processor processor, int modCountBefore) { + private boolean process(Node root, Processor processor, int modCountBefore) { if (root == null) return true; if (!process(root.getLeft(), processor, modCountBefore)) return false; @@ -158,6 +159,7 @@ public abstract class IntervalTreeImpl extends RedBla public boolean processOverlappingWith(int start, int end, @NotNull Processor processor) { try { + normalize(); l.readLock().lock(); checkMax(true); return processOverlappingWith(getRoot(), start, end, processor, modCount, 0); @@ -194,6 +196,7 @@ public abstract class IntervalTreeImpl extends RedBla public boolean processOverlappingWith(int offset, @NotNull Processor processor) { try { + normalize(); l.readLock().lock(); checkMax(true); return processOverlapping(getRoot(), offset, processor, modCount, 0); @@ -203,7 +206,7 @@ public abstract class IntervalTreeImpl extends RedBla } } - protected boolean processOverlapping(MyNode root, int offset, Processor processor, int modCountBefore, int deltaUpToRootExclusive) { + private boolean processOverlapping(MyNode root, int offset, Processor processor, int modCountBefore, int deltaUpToRootExclusive) { if (root == null) { return true; } @@ -380,10 +383,7 @@ public abstract class IntervalTreeImpl extends RedBla private void incDelta(MyNode root, int delta) { if (root == null) return; if (root.key.isValid()) { - int newDelta = root.delta += delta; - if (newDelta != 0) { - normalized = false; - } + root.delta += delta; } else { incDelta(root.getLeft(), delta); @@ -572,7 +572,7 @@ public abstract class IntervalTreeImpl extends RedBla } @NotNull - public Iterator iteratorFrom(@NotNull Interval interval) { + Iterator iteratorFrom(@NotNull Interval interval) { MyNode firstOverlap = findMinOverlappingWith(getRoot(), interval, modCount, 0); if (firstOverlap == null) { return ContainerUtil.emptyIterator(); @@ -582,6 +582,7 @@ public abstract class IntervalTreeImpl extends RedBla private Iterator createIteratorFrom(final MyNode firstNode) { checkMax(true); + normalize(); final int modCountBefore = modCount; return new Iterator() { @@ -622,10 +623,19 @@ public abstract class IntervalTreeImpl extends RedBla }; } - private boolean normalized = true; + protected volatile boolean normalized = true; + public void normalize() { - normalize(getRoot()); - normalized = true; + if (normalized) return; + try { + l.writeLock().lock(); + if (normalized) return; + normalize(getRoot()); + normalized = true; + } + finally { + l.writeLock().unlock(); + } } private void normalize(MyNode root) { @@ -634,4 +644,13 @@ public abstract class IntervalTreeImpl extends RedBla normalize(root.getLeft()); normalize(root.getRight()); } + + private void printSorted() { printSorted(getRoot());} + private void printSorted(MyNode root) { + if (root == null) return; + printSorted(root.getLeft()); + System.out.println(root.key); + printSorted(root.getRight()); + } + } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java index ac7c4d293274..7a075a71046a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java @@ -220,5 +220,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx public boolean sweep(int start, int end, @NotNull SweepProcessor sweepProcessor) { return myHighlighterTree.sweep(start, end, sweepProcessor); } - + public void normalize() { + myHighlighterTree.normalize(); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java index 06b9cb095817..a0a3ee444353 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java @@ -83,6 +83,7 @@ public class RangeMarkerTree extends IntervalTreeImpl affected = new ArrayList(); @@ -161,6 +162,7 @@ public class RangeMarkerTree extends IntervalTreeImpl sweepProcessor) { + normalize(); return sweep(new Generator() { @Override public boolean generate(Processor processor) {