IDEA-142798 Debugger does not activate correct session on breakpoint
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 21 Jul 2015 17:28:32 +0000 (20:28 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 21 Jul 2015 17:29:20 +0000 (20:29 +0300)
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java

index 834f77d9e63e7195d7da4a12a4dcde4c2b6140b0..9fe07c710dab995e0d33cff00f7eaaf45ed5f53a 100644 (file)
@@ -555,12 +555,12 @@ public class XDebugSessionImpl implements XDebugSession {
     if (!myPaused.getAndSet(false)) return;
 
     myDispatcher.getMulticaster().beforeSessionResume();
-    myDebuggerManager.setActiveSession(this, null, false, null);
     mySuspendContext = null;
     myCurrentExecutionStack = null;
     myCurrentStackFrame = null;
     myTopFramePosition = null;
     myActiveNonLineBreakpoint = null;
+    updateExecutionPosition();
     UIUtil.invokeLaterIfNeeded(new Runnable() {
       @Override
       public void run() {
@@ -574,8 +574,11 @@ public class XDebugSessionImpl implements XDebugSession {
 
   @Override
   public void updateExecutionPosition() {
-    boolean isTopFrame = isTopFrameSelected();
-    myDebuggerManager.updateExecutionPoint(getCurrentPosition(), !isTopFrame, getPositionIconRenderer(isTopFrame));
+    // allowed only for the active session
+    if (myDebuggerManager.getCurrentSession() == this) {
+      boolean isTopFrame = isTopFrameSelected();
+      myDebuggerManager.updateExecutionPoint(getCurrentPosition(), !isTopFrame, getPositionIconRenderer(isTopFrame));
+    }
   }
 
   public boolean isTopFrameSelected() {
@@ -617,15 +620,9 @@ public class XDebugSessionImpl implements XDebugSession {
     }
   }
 
-  public void activateSession() {
-    XSourcePosition position = myCurrentStackFrame != null ? myCurrentStackFrame.getSourcePosition() : null;
-    if (position != null) {
-      boolean isTopFrame = isTopFrameSelected();
-      myDebuggerManager.setActiveSession(this, position, !isTopFrame, getPositionIconRenderer(isTopFrame));
-    }
-    else {
-      myDebuggerManager.setActiveSession(this, null, false, null);
-    }
+  void activateSession() {
+    myDebuggerManager.setCurrentSession(this);
+    updateExecutionPosition();
   }
 
   public XBreakpoint<?> getActiveNonLineBreakpoint() {
@@ -733,6 +730,10 @@ public class XDebugSessionImpl implements XDebugSession {
 
     myActiveNonLineBreakpoint =
       (!(breakpoint instanceof XLineBreakpoint) || ((XLineBreakpoint)breakpoint).getType().canBeHitInOtherPlaces()) ? breakpoint : null;
+
+    // set this session active on breakpoint, update execution position will be called inside positionReached
+    myDebuggerManager.setCurrentSession(this);
+
     positionReached(suspendContext);
 
     UIUtil.invokeLaterIfNeeded(new Runnable() {
@@ -824,9 +825,7 @@ public class XDebugSessionImpl implements XDebugSession {
 
     myPaused.set(true);
 
-    if (myTopFramePosition != null) {
-      myDebuggerManager.setActiveSession(this, myTopFramePosition, false, getPositionIconRenderer(true));
-    }
+    updateExecutionPosition();
 
     if (myShowTabOnSuspend.compareAndSet(true, false)) {
       UIUtil.invokeLaterIfNeeded(new Runnable() {
@@ -892,9 +891,9 @@ public class XDebugSessionImpl implements XDebugSession {
         myCurrentExecutionStack = null;
         myCurrentStackFrame = null;
         mySuspendContext = null;
-        if (myDebuggerManager.getCurrentSession() == XDebugSessionImpl.this) {
-          myDebuggerManager.updateExecutionPoint(null, false, null);
-        }
+
+        updateExecutionPosition();
+
         if (breakpointsInitialized) {
           XBreakpointManagerImpl breakpointManager = myDebuggerManager.getBreakpointManager();
           if (myBreakpointListener != null) {
index d4e3cf7f23eb1869b06b5e238d8bc111032b2962..0716146b6ff7c33edd9e55f5eeffd6c897daebcd 100644 (file)
@@ -127,7 +127,7 @@ public class XDebuggerManagerImpl extends XDebuggerManager
             session.activateSession();
           }
           else {
-            setActiveSession(null, null, false, null);
+            setCurrentSession(null);
           }
         }
       }
@@ -260,22 +260,7 @@ public class XDebuggerManagerImpl extends XDebuggerManager
     }
   }
 
-  public void setActiveSession(@Nullable XDebugSessionImpl session, @Nullable XSourcePosition position, boolean useSelection,
-                               final @Nullable GutterIconRenderer gutterIconRenderer) {
-    boolean sessionChanged = myActiveSession.getAndSet(session) != session;
-    if (sessionChanged && session != null) {
-      XDebugSessionTab tab = session.getSessionTab();
-      if (tab != null) {
-        tab.select();
-      }
-    }
-    updateExecutionPoint(position, useSelection, gutterIconRenderer);
-    if (sessionChanged) {
-      onActiveSessionChanged();
-    }
-  }
-
-  public void updateExecutionPoint(@Nullable XSourcePosition position, boolean useSelection, @Nullable GutterIconRenderer gutterIconRenderer) {
+  void updateExecutionPoint(@Nullable XSourcePosition position, boolean useSelection, @Nullable GutterIconRenderer gutterIconRenderer) {
     if (position != null) {
       myExecutionPointHighlighter.show(position, useSelection, gutterIconRenderer);
     }
@@ -332,6 +317,22 @@ public class XDebuggerManagerImpl extends XDebuggerManager
     return myActiveSession.get();
   }
 
+  void setCurrentSession(@Nullable XDebugSessionImpl session) {
+    boolean sessionChanged = myActiveSession.getAndSet(session) != session;
+    if (sessionChanged) {
+      if (session != null) {
+        XDebugSessionTab tab = session.getSessionTab();
+        if (tab != null) {
+          tab.select();
+        }
+      }
+      else {
+        myExecutionPointHighlighter.hide();
+      }
+      onActiveSessionChanged();
+    }
+  }
+
   @Override
   public XDebuggerState getState() {
     return new XDebuggerState(myBreakpointManager.getState(), myWatchesManager.getState());