From 993f405f097d32417bde4624c5d24258a4c04274 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 31 Mar 2017 12:37:17 +0300 Subject: [PATCH] IDEA-168375 Emulate method breakpoints: make the progress non modal - allow early termination --- .../ui/breakpoints/MethodBreakpoint.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java index 1a7da7eda2fe..da776d39b2bf 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java @@ -48,7 +48,9 @@ import com.intellij.psi.*; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; +import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.breakpoints.XBreakpoint; +import com.intellij.xdebugger.breakpoints.XBreakpointListener; import com.sun.jdi.*; import com.sun.jdi.event.LocatableEvent; import com.sun.jdi.event.MethodEntryEvent; @@ -69,6 +71,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes; import javax.swing.*; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.stream.Stream; @@ -132,7 +135,7 @@ public class MethodBreakpoint extends BreakpointWithHighlighter indicatorRef = new AtomicReference<>(); + AtomicReference indicatorRef = new AtomicReference<>(); ApplicationManager.getApplication().invokeAndWait( () -> { ProgressWindowWithNotification progress = @@ -140,13 +143,35 @@ public class MethodBreakpoint extends BreakpointWithHighlighter> listener = new XBreakpointListener>() { + void changed(@NotNull XBreakpoint b) { + if (b == breakpoint.getXBreakpoint()) { + changed.set(true); + indicator.cancel(); + } + } + + @Override + public void breakpointRemoved(@NotNull XBreakpoint b) { + changed(b); + } + + @Override + public void breakpointChanged(@NotNull XBreakpoint b) { + changed(b); + } + }; + + XDebuggerManager.getInstance(debugProcess.getProject()).getBreakpointManager().addBreakpointListener(listener, indicator); ProgressManager.getInstance().executeProcessUnderProgress( () -> processPreparedSubTypes(baseType, subType -> createRequestForPreparedClassEmulated(breakpoint, debugProcess, subType, false), indicator), indicator); - if (indicator.isCanceled()) { + if (indicator.isCanceled() && !changed.get()) { breakpoint.disableEmulation(); } }