mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-81893 "Do not step into the classes" feature does not work after calling of "Smart step" (Shift+F7)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user