IDEA-81893 "Do not step into the classes" feature does not work after calling of...
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 24 Jun 2015 15:04:04 +0000 (18:04 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 24 Jun 2015 15:07:00 +0000 (18:07 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java
java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java
java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java
java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java
java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java
java/testFramework/src/com/intellij/debugger/ExecutionWithDebuggerToolsTestCase.java

index 92fbca93472078543827867ec99214dea7683c07..4e23d5a93f97538ec796c1f92d6bf157e7dbf01a 100644 (file)
@@ -23,6 +23,7 @@ import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
 import com.intellij.debugger.engine.requests.LocatableEventRequestor;
 import com.intellij.debugger.engine.requests.MethodReturnValueWatcher;
 import com.intellij.debugger.impl.DebuggerSession;
+import com.intellij.debugger.impl.DebuggerUtilsEx;
 import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
 import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
 import com.intellij.debugger.requests.Requestor;
@@ -38,6 +39,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.MessageType;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.util.Pair;
+import com.intellij.ui.classFilter.ClassFilter;
 import com.intellij.xdebugger.XDebugSession;
 import com.intellij.xdebugger.breakpoints.XBreakpoint;
 import com.intellij.xdebugger.impl.XDebugSessionImpl;
@@ -51,6 +53,8 @@ import com.sun.jdi.request.EventRequestManager;
 import com.sun.jdi.request.ThreadDeathRequest;
 import com.sun.jdi.request.ThreadStartRequest;
 
+import java.util.List;
+
 /**
  * @author lex
  */
@@ -407,6 +411,13 @@ public class DebugProcessEvents extends DebugProcessImpl {
           final String message = "Method <b>" + ((NamedMethodFilter)methodFilter).getMethodName() + "()</b> has not been called";
           XDebugSessionImpl.NOTIFICATION_GROUP.createNotification(message, MessageType.INFO).notify(project);
         }
+        if (hint.wasStepTargetMethodMatched() && hint.isResetIgnoreFilters()) {
+          List<ClassFilter> activeFilters = getActiveFilters();
+          String currentClassName = getCurrentClassName(suspendContext.getThread());
+          if (currentClassName == null || !DebuggerUtilsEx.isFiltered(currentClassName, activeFilters)) {
+            mySession.resetIgnoreStepFiltersFlag();
+          }
+        }
       }
     }
   }
index 557d630ef8e9f51e1c8e3bc2852cb75efc09344c..85514282eeebdf6c91282bfe1d07c8621d675d8c 100644 (file)
@@ -390,22 +390,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
       EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager();
       StepRequest stepRequest = requestManager.createStepRequest(stepThreadReference, size, depth);
       if (!(hint != null && hint.isIgnoreFilters()) /*&& depth == StepRequest.STEP_INTO*/) {
-        final List<ClassFilter> activeFilters = new ArrayList<ClassFilter>();
-        DebuggerSettings settings = DebuggerSettings.getInstance();
-        if (settings.TRACING_FILTERS_ENABLED) {
-          for (ClassFilter filter : settings.getSteppingFilters()) {
-            if (filter.isEnabled()) {
-              activeFilters.add(filter);
-            }
-          }
-        }
-        for (DebuggerClassFilterProvider provider : Extensions.getExtensions(DebuggerClassFilterProvider.EP_NAME)) {
-          for (ClassFilter filter : provider.getFilters()) {
-            if (filter.isEnabled()) {
-              activeFilters.add(filter);
-            }
-          }
-        }
+        List<ClassFilter> activeFilters = getActiveFilters();
 
         if (!activeFilters.isEmpty()) {
           final String currentClassName = getCurrentClassName(stepThread);
@@ -434,6 +419,27 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
     }
   }
 
+  @NotNull
+  static List<ClassFilter> getActiveFilters() {
+    List<ClassFilter> activeFilters = new ArrayList<ClassFilter>();
+    DebuggerSettings settings = DebuggerSettings.getInstance();
+    if (settings.TRACING_FILTERS_ENABLED) {
+      for (ClassFilter filter : settings.getSteppingFilters()) {
+        if (filter.isEnabled()) {
+          activeFilters.add(filter);
+        }
+      }
+    }
+    for (DebuggerClassFilterProvider provider : Extensions.getExtensions(DebuggerClassFilterProvider.EP_NAME)) {
+      for (ClassFilter filter : provider.getFilters()) {
+        if (filter.isEnabled()) {
+          activeFilters.add(filter);
+        }
+      }
+    }
+    return activeFilters;
+  }
+
   void deleteStepRequests(@Nullable final ThreadReference stepThread) {
     EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager();
     List<StepRequest> stepRequests = requestManager.stepRequests();
@@ -456,7 +462,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
   }
 
   @Nullable
-  private static String getCurrentClassName(ThreadReferenceProxyImpl thread) {
+  static String getCurrentClassName(ThreadReferenceProxyImpl thread) {
     try {
       if (thread != null && thread.frameCount() > 0) {
         StackFrameProxyImpl stackFrame = thread.frame(0);
@@ -1507,6 +1513,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
       final RequestHint hint = mySmartStepFilter != null?
                                new RequestHint(stepThread, suspendContext, mySmartStepFilter) :
                                new RequestHint(stepThread, suspendContext, StepRequest.STEP_INTO);
+      hint.setResetIgnoreFilters(mySmartStepFilter != null && !mySession.shouldIgnoreSteppingFilters());
       if (myForcedIgnoreFilters) {
         try {
           mySession.setIgnoreStepFiltersFlag(stepThread.frameCount());
index 735f941aaa6b2912ddc977dc2626a0632d9928ab..af98a79a9862cf03439cf47f8c7b6a6ebe932f32 100644 (file)
@@ -55,6 +55,7 @@ public class RequestHint {
   private boolean myTargetMethodMatched = false;
 
   private boolean myIgnoreFilters = false;
+  private boolean myResetIgnoreFilters = false;
   private boolean myRestoreBreakpoints = false;
 
   public RequestHint(final ThreadReferenceProxyImpl stepThread, final SuspendContextImpl suspendContext, @NotNull MethodFilter methodFilter) {
@@ -111,6 +112,14 @@ public class RequestHint {
     myIgnoreFilters = ignoreFilters;
   }
 
+  public void setResetIgnoreFilters(boolean resetIgnoreFilters) {
+    myResetIgnoreFilters = resetIgnoreFilters;
+  }
+
+  public boolean isResetIgnoreFilters() {
+    return myResetIgnoreFilters;
+  }
+
   public void setRestoreBreakpoints(boolean restoreBreakpoints) {
     myRestoreBreakpoints = restoreBreakpoints;
   }
index cf471b99592d6b35c8cf6ce2c890201e68289d80..6346d831943fc3016b5575b7204ab5acd0f3a203 100644 (file)
@@ -41,7 +41,6 @@ import com.intellij.idea.ActionsBundle;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.ModalityState;
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.util.Comparing;
@@ -322,12 +321,17 @@ public class DebuggerSession implements AbstractDebuggerSession {
     }
   }
 
-  private void resetIgnoreStepFiltersFlag() {
+  public void resetIgnoreStepFiltersFlag() {
     myIgnoreFiltersFrameCountThreshold = 0;
   }
 
   public void setIgnoreStepFiltersFlag(int currentStackFrameCount) {
-    myIgnoreFiltersFrameCountThreshold = currentStackFrameCount;
+    if (myIgnoreFiltersFrameCountThreshold <= 0) {
+      myIgnoreFiltersFrameCountThreshold = currentStackFrameCount;
+    }
+    else {
+      myIgnoreFiltersFrameCountThreshold = Math.min(myIgnoreFiltersFrameCountThreshold, currentStackFrameCount);
+    }
   }
 
   public boolean shouldIgnoreSteppingFilters() {
index b776bcad734972e226b134794cec8298ecfe5d47..d190ca1d672f55694c3691f62cbc7d116c49356c 100644 (file)
@@ -235,12 +235,12 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
     return false;
   }
 
-  public static boolean isFiltered(String qName, ClassFilter[] classFilters) {
+  public static boolean isFiltered(@NotNull String qName, ClassFilter[] classFilters) {
     return isFiltered(qName, Arrays.asList(classFilters));
   }
   
-  public static boolean isFiltered(String qName, List<ClassFilter> classFilters) {
-    if(qName.indexOf('[') != -1) {
+  public static boolean isFiltered(@NotNull String qName, List<ClassFilter> classFilters) {
+    if (qName.indexOf('[') != -1) {
       return false; //is array
     }
 
index 653a11879d00ae3f053ff878b82645d427c5a6fd..5c4ba6b9baedb717159ac2d3081d94f62f96cc8e 100644 (file)
@@ -90,6 +90,11 @@ public abstract class ExecutionWithDebuggerToolsTestCase extends ExecutionTestCa
     debugProcess.getManagerThread().schedule(debugProcess.createResumeCommand(context, PrioritizedTask.Priority.LOW));
   }
 
+  protected void stepInto(SuspendContextImpl context) {
+    DebugProcessImpl debugProcess = context.getDebugProcess();
+    debugProcess.getManagerThread().schedule(debugProcess.createStepIntoCommand(context, false, null));
+  }
+
   protected void waitBreakpoints() {
     myScriptRunnablesSema.down();
     waitFor(new Runnable() {