an API for filtering out stack frames considered internal

This commit is contained in:
peter
2010-03-04 17:03:35 +00:00
parent e1cbdca05a
commit d2a5654e9d
9 changed files with 64 additions and 30 deletions
@@ -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;
}
}
@@ -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"/>
+2
View File
@@ -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"/>
@@ -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;
}
}
+2
View File
@@ -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"/>