mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-101710 Exception Breakpoints | Any Exception with Multiple Class Filters doesn't work
This commit is contained in:
+23
-19
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user