mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
an API for filtering out stack frames considered internal
This commit is contained in:
@@ -27,12 +27,9 @@ import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.ui.classFilter.ClassFilter;
|
||||
import com.intellij.ui.classFilter.DebuggerClassFilterProvider;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
@@ -72,7 +69,7 @@ public class ExceptionFilter implements Filter, DumbAware {
|
||||
final int lastDotIndex = line.lastIndexOf('.', lparenthIndex);
|
||||
if (lastDotIndex < 0 || lastDotIndex < atIndex) return null;
|
||||
String className = line.substring(atIndex + AT.length() + 1, lastDotIndex).trim();
|
||||
final String fullName = className;
|
||||
final boolean isInternal = shouldFold(className);
|
||||
final int dollarIndex = className.indexOf('$');
|
||||
if (dollarIndex >= 0){
|
||||
className = className.substring(0, dollarIndex);
|
||||
@@ -116,23 +113,19 @@ public class ExceptionFilter implements Filter, DumbAware {
|
||||
attributes.setForegroundColor(color);
|
||||
attributes.setEffectColor(color);
|
||||
}
|
||||
return new Result(highlightStartOffset, highlightEndOffset, info, attributes, getFoldingPlaceholder(fullName));
|
||||
return new Result(highlightStartOffset, highlightEndOffset, info, attributes, isInternal);
|
||||
}
|
||||
catch(NumberFormatException e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static String getFoldingPlaceholder(String className) {
|
||||
for (DebuggerClassFilterProvider provider : DebuggerClassFilterProvider.EP_NAME.getExtensions()) {
|
||||
for (ClassFilter filter : provider.getFilters()) {
|
||||
final String pattern = filter.getPattern();
|
||||
if (pattern.endsWith("*") && className.startsWith(pattern.substring(0, pattern.length() - 1))) {
|
||||
return "...";
|
||||
}
|
||||
private static boolean shouldFold(String className) {
|
||||
for (StackFrameFilter provider : StackFrameFilter.EP_NAME.getExtensions()) {
|
||||
if (provider.isInternalFrame(className, "")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package com.intellij.execution.filters;
|
||||
|
||||
/**
|
||||
* @author peter
|
||||
*/
|
||||
public class ReflectionStackFrameFilter extends StackFrameFilter {
|
||||
public boolean isInternalFrame(String className, String methodName) {
|
||||
return className.startsWith("sun.reflect.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.intellij.execution.filters;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
|
||||
/**
|
||||
* @author peter
|
||||
*/
|
||||
public abstract class StackFrameFilter {
|
||||
public static final ExtensionPointName<StackFrameFilter> EP_NAME = ExtensionPointName.create("com.intellij.stackFrameFilter");
|
||||
|
||||
public abstract boolean isInternalFrame(String className, String methodName);
|
||||
|
||||
}
|
||||
@@ -28,22 +28,22 @@ public interface Filter {
|
||||
public final int highlightEndOffset;
|
||||
public final TextAttributes highlightAttributes;
|
||||
public final HyperlinkInfo hyperlinkInfo;
|
||||
@Nullable public final String foldingPlaceholder;
|
||||
public final boolean isInternal;
|
||||
|
||||
public Result(final int highlightStartOffset, final int highlightEndOffset, final HyperlinkInfo hyperlinkInfo) {
|
||||
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo, null);
|
||||
}
|
||||
|
||||
public Result(final int highlightStartOffset, final int highlightEndOffset, final HyperlinkInfo hyperlinkInfo, final TextAttributes highlightAttributes) {
|
||||
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo, highlightAttributes, null);
|
||||
this(highlightStartOffset, highlightEndOffset, hyperlinkInfo, highlightAttributes, false);
|
||||
}
|
||||
|
||||
public Result(final int highlightStartOffset, final int highlightEndOffset, final HyperlinkInfo hyperlinkInfo, final TextAttributes highlightAttributes, @Nullable String foldingPlaceholder) {
|
||||
public Result(final int highlightStartOffset, final int highlightEndOffset, final HyperlinkInfo hyperlinkInfo, final TextAttributes highlightAttributes, boolean isInternal) {
|
||||
this.highlightStartOffset = highlightStartOffset;
|
||||
this.highlightEndOffset = highlightEndOffset;
|
||||
this.highlightAttributes = highlightAttributes;
|
||||
this.hyperlinkInfo = hyperlinkInfo;
|
||||
this.foldingPlaceholder = foldingPlaceholder;
|
||||
this.isInternal = isInternal;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
|
||||
|
||||
private ArrayList<TokenInfo> myTokens = new ArrayList<TokenInfo>();
|
||||
private final Hyperlinks myHyperlinks = new Hyperlinks();
|
||||
private final TIntObjectHashMap<String> myFolding = new TIntObjectHashMap<String>();
|
||||
private final TIntObjectHashMap<Boolean> myFolding = new TIntObjectHashMap<Boolean>();
|
||||
|
||||
private String myHelpId;
|
||||
|
||||
@@ -826,7 +826,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
|
||||
final int highlightEndOffset = result.highlightEndOffset;
|
||||
final HyperlinkInfo hyperlinkInfo = result.hyperlinkInfo;
|
||||
addHyperlink(highlightStartOffset, highlightEndOffset, result.highlightAttributes, hyperlinkInfo, hyperlinkAttributes);
|
||||
addFolding(document, chars, line, result.foldingPlaceholder, toAdd);
|
||||
addFolding(document, chars, line, result.isInternal, toAdd);
|
||||
}
|
||||
}
|
||||
if (!toAdd.isEmpty() || !toRemove.isEmpty()) {
|
||||
@@ -864,21 +864,23 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo
|
||||
return toRemove;
|
||||
}
|
||||
|
||||
private void addFolding(Document document, CharSequence chars, int line, @Nullable String placeholder, List<FoldRegion> toAdd) {
|
||||
myFolding.put(line, placeholder);
|
||||
final String prevFolding = myFolding.get(line - 1);
|
||||
if (prevFolding != null && !prevFolding.equals(placeholder)) {
|
||||
private void addFolding(Document document, CharSequence chars, int line, boolean isInternal, List<FoldRegion> toAdd) {
|
||||
myFolding.put(line, isInternal);
|
||||
final Boolean prevFolding = myFolding.get(line - 1);
|
||||
if (!isInternal && Boolean.TRUE.equals(prevFolding)) {
|
||||
final int lEnd = line - 1;
|
||||
int lStart = lEnd;
|
||||
while (prevFolding.equals(myFolding.get(lStart - 1))) lStart--;
|
||||
while (Boolean.TRUE.equals(myFolding.get(lStart - 1))) lStart--;
|
||||
if (lStart == lEnd) {
|
||||
return;
|
||||
}
|
||||
|
||||
int oStart = CharArrayUtil.shiftForward(chars, document.getLineStartOffset(lStart), " \t");
|
||||
int oStart = document.getLineStartOffset(lStart);
|
||||
oStart = CharArrayUtil.shiftForward(chars, oStart, " \t");
|
||||
// if (oStart > 0) oStart--;
|
||||
int oEnd = CharArrayUtil.shiftBackward(chars, document.getLineEndOffset(lEnd) - 1, " \t") + 1;
|
||||
|
||||
toAdd.add(new FoldRegionImpl(myEditor, oStart, oEnd, prevFolding, null));
|
||||
toAdd.add(new FoldRegionImpl(myEditor, oStart, oEnd, " " + (lEnd - lStart + 1) + " internal calls", null));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -239,6 +239,8 @@
|
||||
|
||||
<extensionPoint name="consoleFilterProvider" interface="com.intellij.execution.filters.ConsoleFilterProvider"/>
|
||||
|
||||
<extensionPoint name="stackFrameFilter" interface="com.intellij.execution.filters.StackFrameFilter"/>
|
||||
|
||||
<extensionPoint name="configurationProducer"
|
||||
interface="com.intellij.execution.junit.RuntimeConfigurationProducer"/>
|
||||
|
||||
|
||||
@@ -134,6 +134,8 @@
|
||||
<completion.contributor language="Groovy" implementationClass="org.jetbrains.plugins.groovy.lang.completion.GroovySmartCompletionContributor"/>
|
||||
|
||||
<debuggerClassFilterProvider implementation="org.jetbrains.plugins.groovy.debugger.filters.GroovyDebuggerClassFilterProvider"/>
|
||||
<stackFrameFilter implementation="org.jetbrains.plugins.groovy.debugger.filters.GroovyDebuggerClassFilterProvider"/>
|
||||
|
||||
<xdebugger.settings implementation="org.jetbrains.plugins.groovy.debugger.filters.GroovyDebuggerSettings"/>
|
||||
<fileTypeIndentOptionsProvider implementation="org.jetbrains.plugins.groovy.formatter.GroovyIndentOptionsProvider"/>
|
||||
|
||||
|
||||
+13
-3
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.jetbrains.plugins.groovy.debugger.filters;
|
||||
|
||||
import com.intellij.execution.filters.StackFrameFilter;
|
||||
import com.intellij.ui.classFilter.ClassFilter;
|
||||
import com.intellij.ui.classFilter.DebuggerClassFilterProvider;
|
||||
|
||||
@@ -25,8 +26,8 @@ import java.util.List;
|
||||
/**
|
||||
* @author ilyas
|
||||
*/
|
||||
public class GroovyDebuggerClassFilterProvider implements DebuggerClassFilterProvider {
|
||||
private static final ClassFilter[] FITERS = {new ClassFilter("org.codehaus.groovy.*"), new ClassFilter("groovy.*")};
|
||||
public class GroovyDebuggerClassFilterProvider extends StackFrameFilter implements DebuggerClassFilterProvider {
|
||||
private static final ClassFilter[] FILTERS = {new ClassFilter("org.codehaus.groovy.*"), new ClassFilter("groovy.*")};
|
||||
|
||||
public List<ClassFilter> getFilters() {
|
||||
|
||||
@@ -34,10 +35,19 @@ public class GroovyDebuggerClassFilterProvider implements DebuggerClassFilterPro
|
||||
final Boolean flag = settings.DEBUG_DISABLE_SPECIFIC_GROOVY_METHODS;
|
||||
final ArrayList<ClassFilter> list = new ArrayList<ClassFilter>();
|
||||
if (flag == null || flag.booleanValue()) {
|
||||
list.addAll(Arrays.asList(FITERS));
|
||||
list.addAll(Arrays.asList(FILTERS));
|
||||
return list;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public boolean isInternalFrame(String className, String methodName) {
|
||||
for (ClassFilter filter : FILTERS) {
|
||||
final String pattern = filter.getPattern();
|
||||
if (className.startsWith(pattern.substring(0, pattern.length() - 1))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -712,6 +712,8 @@
|
||||
|
||||
<consoleFilterProvider implementation="com.intellij.execution.filters.DefaultConsoleFiltersProvider"/>
|
||||
|
||||
<stackFrameFilter implementation="com.intellij.execution.filters.ReflectionStackFrameFilter"/>
|
||||
|
||||
<quoteHandler fileType="JAVA" className="com.intellij.codeInsight.editorActions.JavaQuoteHandler"/>
|
||||
<typedHandler implementation="com.intellij.codeInsight.editorActions.JavaTypedHandler" id="java"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user