IDEA-101710 Exception Breakpoints | Any Exception with Multiple Class Filters doesn't work

This commit is contained in:
Egor.Ushakov
2013-12-31 12:45:15 +04:00
parent fe16acc8d4
commit 08308710a6
4 changed files with 66 additions and 41 deletions
@@ -22,6 +22,7 @@ import com.intellij.debugger.engine.*;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.events.DebuggerCommandImpl;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.requests.ClassPrepareRequestor;
import com.intellij.debugger.requests.RequestManager;
import com.intellij.debugger.requests.Requestor;
@@ -163,29 +164,32 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque
if (requestor.CLASS_FILTERS_ENABLED && !(request instanceof BreakpointRequest) /*no built-in class filters support for breakpoint requests*/ ) {
ClassFilter[] classFilters = requestor.getClassFilters();
for (final ClassFilter filter : classFilters) {
if (!filter.isEnabled()) {
continue;
}
final JVMName jvmClassName = ApplicationManager.getApplication().runReadAction(new Computable<JVMName>() {
public JVMName compute() {
PsiClass psiClass = DebuggerUtils.findClass(filter.getPattern(), myDebugProcess.getProject(), myDebugProcess.getSearchScope());
if (psiClass == null) {
return null;
if (DebuggerUtilsEx.getEnabledNumber(classFilters) == 1) {
for (final ClassFilter filter : classFilters) {
if (!filter.isEnabled()) {
continue;
}
final JVMName jvmClassName = ApplicationManager.getApplication().runReadAction(new Computable<JVMName>() {
public JVMName compute() {
PsiClass psiClass = DebuggerUtils.findClass(filter.getPattern(), myDebugProcess.getProject(), myDebugProcess.getSearchScope());
if (psiClass == null) {
return null;
}
return JVMNameUtil.getJVMQualifiedName(psiClass);
}
});
String pattern = filter.getPattern();
try {
if (jvmClassName != null) {
pattern = jvmClassName.getName(myDebugProcess);
}
return JVMNameUtil.getJVMQualifiedName(psiClass);
}
});
String pattern = filter.getPattern();
try {
if (jvmClassName != null) {
pattern = jvmClassName.getName(myDebugProcess);
catch (EvaluateException ignored) {
}
}
catch (EvaluateException ignored) {
}
addClassFilter(request, pattern);
addClassFilter(request, pattern);
break; // adding more than one inclusion filter does not work, only events that satisfy ALL filters are placed in the event queue.
}
}
for (ClassFilter filter : requestor.getClassExclusionFilters()) {
@@ -230,6 +230,16 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
}
return false;
}
public static int getEnabledNumber(ClassFilter[] classFilters) {
int res = 0;
for (ClassFilter filter : classFilters) {
if (filter.isEnabled()) {
res++;
}
}
return res;
}
public static ClassFilter[] readFilters(List children) throws InvalidDataException {
if (children == null || children.size() == 0) {
@@ -33,14 +33,12 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.psi.PsiElement;
import com.intellij.ui.classFilter.ClassFilter;
import com.sun.jdi.BooleanValue;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.Value;
import com.sun.jdi.*;
import com.sun.jdi.event.LocatableEvent;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -174,6 +172,11 @@ public abstract class FilteredRequestor implements LocatableEventRequestor, JDOM
}
}
if (CLASS_FILTERS_ENABLED) {
Location location = event.location();
if (!typeMatchesClassFilters(location.declaringType().name())) return false;
}
if (CONDITION_ENABLED && getCondition() != null && !"".equals(getCondition().getText())) {
try {
ExpressionEvaluator evaluator = DebuggerInvocationUtil.commitAndRunReadAction(context.getProject(), new EvaluatingComputable<ExpressionEvaluator>() {
@@ -211,6 +214,31 @@ public abstract class FilteredRequestor implements LocatableEventRequestor, JDOM
return true;
}
boolean typeMatchesClassFilters(@Nullable String typeName) {
if (typeName == null) {
return true;
}
boolean matches = false, hasEnabled = false;
for (ClassFilter classFilter : getClassFilters()) {
if (classFilter.isEnabled()) {
hasEnabled = true;
if (classFilter.matches(typeName)) {
matches = true;
break;
}
}
}
if(hasEnabled && !matches) {
return false;
}
for (ClassFilter classFilter : getClassExclusionFilters()) {
if (classFilter.isEnabled() && classFilter.matches(typeName)) {
return false;
}
}
return true;
}
public abstract PsiElement getEvaluationElement();
public TextWithImports getCondition() {
@@ -49,7 +49,6 @@ import com.intellij.psi.jsp.JspFile;
import com.intellij.psi.search.EverythingGlobalScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.util.Function;
import com.intellij.util.Processor;
import com.intellij.util.StringBuilderSpinAllocator;
@@ -333,23 +332,7 @@ public class LineBreakpoint extends BreakpointWithHighlighter {
className = frame.location().declaringType().name();
}
}
if (className != null) {
boolean matches = false;
for (ClassFilter classFilter : getClassFilters()) {
if (classFilter.isEnabled() && classFilter.matches(className)) {
matches = true;
break;
}
}
if(!matches) {
return false;
}
for (ClassFilter classFilter : getClassExclusionFilters()) {
if (classFilter.isEnabled() && classFilter.matches(className)) {
return false;
}
}
}
if (!typeMatchesClassFilters(className)) return false;
}
return super.evaluateCondition(context, event);
}