diff --git a/java/java-tests/testSrc/com/intellij/execution/filters/ExceptionWorkerTest.java b/java/java-tests/testSrc/com/intellij/execution/filters/ExceptionWorkerTest.java index 4c5fd19b17c6..09e90a7c31b4 100644 --- a/java/java-tests/testSrc/com/intellij/execution/filters/ExceptionWorkerTest.java +++ b/java/java-tests/testSrc/com/intellij/execution/filters/ExceptionWorkerTest.java @@ -5,7 +5,6 @@ import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.util.TextRange; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; -import com.intellij.util.Consumer; import java.util.ArrayList; @@ -55,8 +54,8 @@ public class ExceptionWorkerTest extends LightCodeInsightFixtureTestCase { final Document document = EditorFactory.getInstance().createDocument(testData); FilterMixin filter = (FilterMixin)new ExceptionExFilterFactory().create(GlobalSearchScope.projectScope(getProject())); final ArrayList result = new ArrayList(); - filter.applyHeavyFilter(document, 0, 0, - highlight -> result.add(new TextRange(highlight.getStart(), highlight.getEnd() - 1).substring(testData))); + filter.applyHeavyFilter(document, 0, 0, r -> r.getResultItems().forEach( + highlight -> result.add(new TextRange(highlight.getHighlightStartOffset(), highlight.getHighlightEndOffset() - 1).substring(testData)))); assertSameElements(result, "com.sample.RunningMain.func1", "com.sample.RunningMain.main"); } } 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 da8fe5377d9e..0b895b250e89 100644 --- a/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java +++ b/platform/lang-api/src/com/intellij/execution/filters/FilterMixin.java @@ -20,6 +20,7 @@ import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; /** * Created by IntelliJ IDEA. @@ -34,24 +35,29 @@ public interface FilterMixin { @NotNull String getUpdateMessage(); - abstract class AdditionalHighlight { - private final int myStart; - private final int myEnd; - - protected AdditionalHighlight(int start, int end) { - myStart = start; - myEnd = end; + class AdditionalHighlight extends Filter.Result { + public AdditionalHighlight(int start, int end) { + super(start, end, null); } + @SuppressWarnings("unused") + public AdditionalHighlight(@NotNull List resultItems) { + super(resultItems); + } + + @Deprecated public int getStart() { - return myStart; + return getHighlightStartOffset(); } + @Deprecated public int getEnd() { - return myEnd; + return getHighlightEndOffset(); } - @NotNull - public abstract TextAttributes getTextAttributes(@Nullable final TextAttributes source); + @Nullable + public TextAttributes getTextAttributes(@Nullable final TextAttributes source) { + return null; + } } } 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 b01873d8413b..1ba6f9af33cc 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -24,6 +24,7 @@ import com.intellij.execution.ExecutionBundle; import com.intellij.execution.actions.ConsoleActionsPostProcessor; import com.intellij.execution.actions.EOFAction; import com.intellij.execution.filters.*; +import com.intellij.execution.filters.Filter.ResultItem; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; @@ -1075,8 +1076,15 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo @Override public void doRun() { if (myHeavyUpdateTicket != currentValue) return; - myHyperlinks.addHighlighter(additionalHighlight.getStart(), additionalHighlight.getEnd(), - additionalHighlight.getTextAttributes(null)); + TextAttributes additionalAttributes = additionalHighlight.getTextAttributes(null); + if (additionalAttributes != null) { + ResultItem item = additionalHighlight.getResultItems().get(0); + myHyperlinks.addHighlighter(item.getHighlightStartOffset(), item.getHighlightEndOffset(), + additionalAttributes); + } + else { + myHyperlinks.highlightHyperlinks(additionalHighlight); + } } @Override diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java index 7689b0378f3a..01f8863ff5c8 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java @@ -275,22 +275,27 @@ public class EditorHyperlinkSupport { final String text = getLineText(document, line, true); Filter.Result result = customFilter.applyFilter(text, endOffset); if (result != null) { - for (Filter.ResultItem resultItem : result.getResultItems()) { - int start = resultItem.getHighlightStartOffset(); - int end = resultItem.getHighlightEndOffset(); - if (end < start || end > document.getTextLength()) { - LOG.error("Filter returned wrong range: start=" + start + "; end=" + end + "; length=" + document.getTextLength() + "; filter=" + customFilter); - continue; - } + highlightHyperlinks(result); + } + } + } - TextAttributes attributes = resultItem.getHighlightAttributes(); - if (resultItem.getHyperlinkInfo() != null) { - createHyperlink(start, end, attributes, resultItem.getHyperlinkInfo(), resultItem.getFollowedHyperlinkAttributes()); - } - else if (attributes != null) { - addHighlighter(start, end, attributes); - } - } + public void highlightHyperlinks(@NotNull Filter.Result result) { + Document document = myEditor.getDocument(); + for (Filter.ResultItem resultItem : result.getResultItems()) { + int start = resultItem.getHighlightStartOffset(); + int end = resultItem.getHighlightEndOffset(); + if (end < start || end > document.getTextLength()) { + LOG.error("Filter returned wrong range: start=" + start + "; end=" + end + "; length=" + document.getTextLength()); + continue; + } + + TextAttributes attributes = resultItem.getHighlightAttributes(); + if (resultItem.getHyperlinkInfo() != null) { + createHyperlink(start, end, attributes, resultItem.getHyperlinkInfo(), resultItem.getFollowedHyperlinkAttributes()); + } + else if (attributes != null) { + addHighlighter(start, end, attributes); } } }