From c51edb445bd758519f2401b5b82a482fdccb5df1 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 21 Feb 2012 21:17:19 +0300 Subject: [PATCH] freeze on SOE rendering, disappearing traces and invalid range marker assertion --- .../filters/ExceptionExFilterFactory.java | 62 +++++++++++-------- .../execution/filters/FilterMixin.java | 1 - .../execution/impl/ConsoleViewImpl.java | 35 ++++++----- 3 files changed, 57 insertions(+), 41 deletions(-) diff --git a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionExFilterFactory.java b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionExFilterFactory.java index e28c2a3041ef..cd5861f2d579 100644 --- a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionExFilterFactory.java +++ b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionExFilterFactory.java @@ -27,10 +27,12 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; import com.intellij.util.ui.UIUtil; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.Map; /** * @author gregsh @@ -62,38 +64,48 @@ public class ExceptionExFilterFactory implements ExceptionFilterFactory { final int startOffset, int startLineNumber, final Consumer consumer) { + Map> visited = new THashMap>(); + final Trinity emptyInfo = Trinity.create(null, null, null); + + final ExceptionWorker worker = new ExceptionWorker(myScope.getProject(), myScope); for (int i = 0; i < copiedFragment.getLineCount(); i++) { final int lineStartOffset = copiedFragment.getLineStartOffset(i); final int lineEndOffset = copiedFragment.getLineEndOffset(i); - final ExceptionWorker worker = new ExceptionWorker(myScope.getProject(), myScope); - Result result = null; - AccessToken token = ApplicationManager.getApplication().acquireReadActionLock(); - try { - String text = copiedFragment.getText(new TextRange(lineStartOffset, lineEndOffset)); - worker.execute(text, lineEndOffset); - result = worker.getResult(); - if (result == null) continue; - int offset = result.hyperlinkInfo instanceof OpenFileHyperlinkInfo - ? ((OpenFileHyperlinkInfo)result.hyperlinkInfo).getDescriptor().getOffset() - : -1; - PsiFile psiFile = worker.getFile(); - if (offset <= 0 || psiFile == null) continue; - PsiElement element = psiFile.findElementAt(offset); - PsiTryStatement parent = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class, true, PsiClass.class); - PsiCodeBlock tryBlock = parent != null? parent.getTryBlock() : null; - if (tryBlock == null || !tryBlock.getTextRange().contains(offset)) continue; + + String text = copiedFragment.getText(new TextRange(lineStartOffset, lineEndOffset)); + if (!text.contains(".java:")) continue; + Trinity info = visited.get(text); + if (info == emptyInfo) continue; + + if (info == null) { + info = emptyInfo; + AccessToken token = ApplicationManager.getApplication().acquireReadActionLock(); + try { + worker.execute(text, lineEndOffset); + Result result = worker.getResult(); + if (result == null) continue; + int offset = result.hyperlinkInfo instanceof OpenFileHyperlinkInfo + ? ((OpenFileHyperlinkInfo)result.hyperlinkInfo).getDescriptor().getOffset() + : -1; + PsiFile psiFile = worker.getFile(); + if (offset <= 0 || psiFile == null) continue; + PsiElement element = psiFile.findElementAt(offset); + PsiTryStatement parent = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class, true, PsiClass.class); + PsiCodeBlock tryBlock = parent != null? parent.getTryBlock() : null; + if (tryBlock == null || !tryBlock.getTextRange().contains(offset)) continue; + info = worker.getInfo(); + } + finally { + token.finish(); + visited.put(text, info); + } } - finally { - token.finish(); - } - Trinity info = worker.getInfo(); int off = startOffset + lineStartOffset; - final TextAttributes attributes = result.highlightAttributes; - attributes.setEffectColor(UIUtil.getInactiveTextColor()); + final Color color = UIUtil.getInactiveTextColor(); consumer.consume(new AdditionalHighlight(off + info.first.getStartOffset(), off + info.second.getEndOffset()) { @Override public TextAttributes getTextAttributes(@Nullable TextAttributes source) { - return new TextAttributes(null, null, attributes.getEffectColor(), EffectType.BOLD_DOTTED_LINE, Font.PLAIN); + return new TextAttributes(null, null, color, EffectType.BOLD_DOTTED_LINE, Font.PLAIN); } }); } @@ -101,7 +113,7 @@ public class ExceptionExFilterFactory implements ExceptionFilterFactory { @Override public String getUpdateMessage() { - return "Checking try/finally blocks"; + return "Highlighting try blocks"; } } } diff --git a/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java b/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java index b84d43e4cec3..059c6f65879f 100644 --- a/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java +++ b/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.Nullable; */ public interface FilterMixin { boolean shouldRunHeavy(); - @Nullable void applyHeavyFilter(Document copiedFragment, int startOffset, int startLineNumber, Consumer consumer); String getUpdateMessage(); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index e9e587a2205f..acf3baf1e804 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -480,7 +480,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo flushDeferredUserInput(); } } - if (myFlushAlarm.getActiveRequestCount() == 0 && myEditor != null && !myFlushAlarm.isDisposed()) { + if (myEditor != null && !myFlushAlarm.isDisposed()) { final boolean shouldFlushNow = myBuffer.isUseCyclicBuffer() && myBuffer.getLength() >= myBuffer.getCyclicBufferSize(); myFlushAlarm.addRequest(myFlushDeferredRunnable, shouldFlushNow ? 0 : FLUSH_DELAY, getStateForUpdate()); } @@ -541,6 +541,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo myEditor.getMarkupModel().removeAllHighlighters(); document = myEditor.getDocument(); myFoldingAlarm.cancelAllRequests(); + cancelHeavyAlarm(); } CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { @@ -862,21 +863,25 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo @Override public void run() { if (! myPredefinedMessageFilter.shouldRunHeavy()) return; - myPredefinedMessageFilter.applyHeavyFilter(documentCopy, startOffset, startLine, new Consumer() { - @Override - public void consume(final FilterMixin.AdditionalHighlight additionalHighlight) { - if (myFlushAlarm.isDisposed()) return; - myFlushAlarm.addRequest(new Runnable() { - @Override - public void run() { - if (myHeavyUpdateTicket != currentValue) return; - myHyperlinks.adjustHighlighters(Collections.singletonList(additionalHighlight)); - } - }, 0, getStateForUpdate()); + try { + myPredefinedMessageFilter.applyHeavyFilter(documentCopy, startOffset, startLine, new Consumer() { + @Override + public void consume(final FilterMixin.AdditionalHighlight additionalHighlight) { + if (myFlushAlarm.isDisposed()) return; + myFlushAlarm.addRequest(new Runnable() { + @Override + public void run() { + if (myHeavyUpdateTicket != currentValue) return; + myHyperlinks.adjustHighlighters(Collections.singletonList(additionalHighlight)); + } + }, 0, getStateForUpdate()); + } + }); + } + finally { + if (myHeavyAlarm.getActiveRequestCount() == 0) { + SwingUtilities.invokeLater(myFinishProgress); } - }); - if (myHeavyAlarm.getActiveRequestCount() == 0) { - SwingUtilities.invokeLater(myFinishProgress); } } }, 0);