[^alexander.kirsanov @ rider] support hyperlinks in console heavy filters

This commit is contained in:
peter
2016-06-08 08:22:37 +02:00
parent 82c5940e0b
commit 23be01f58f
4 changed files with 49 additions and 31 deletions
@@ -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<String> result = new ArrayList<String>();
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");
}
}
@@ -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<Filter.ResultItem> 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;
}
}
}
@@ -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
@@ -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);
}
}
}