diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java index b947271d47e8..832958759964 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java @@ -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() { - 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() { + 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()) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index c8b47e44c292..aa2b4793ec42 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -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) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java index e8fd23ead332..e83d7096347c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java @@ -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() { @@ -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() { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/LineBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/LineBreakpoint.java index a78cb1315ea7..c273457c7521 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/LineBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/LineBreakpoint.java @@ -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); }