fixed hot swap not working in existing debug session after failed another session...
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 8 Jul 2015 10:52:05 +0000 (13:52 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 8 Jul 2015 10:55:35 +0000 (13:55 +0300)
java/debugger/impl/src/com/intellij/debugger/actions/HotSwapAction.java
java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java

index aeaacaa042f1595fa93576eb935b988b4ca535bc..db2c6b124b96de0fe97e361ce894d10ca7fc2ae3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,11 +19,11 @@ import com.intellij.debugger.DebuggerManagerEx;
 import com.intellij.debugger.impl.DebuggerSession;
 import com.intellij.debugger.settings.DebuggerSettings;
 import com.intellij.debugger.ui.HotSwapUI;
+import com.intellij.debugger.ui.HotSwapUIImpl;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.CommonDataKeys;
 import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
 import com.intellij.openapi.project.Project;
 
 /**
@@ -57,6 +57,6 @@ public class HotSwapAction extends AnAction{
     DebuggerManagerEx debuggerManager = DebuggerManagerEx.getInstanceEx(project);
     DebuggerSession session = debuggerManager.getContext().getDebuggerSession();
 
-    e.getPresentation().setEnabled(session != null && session.isAttached() && session.getProcess().canRedefineClasses());
+    e.getPresentation().setEnabled(session != null && HotSwapUIImpl.canHotSwap(session));
   }
 }
index ccdb97f867f82b2a7ed32320b1b8196dc5724b2e..0a31fd88d369c6d63ba6c236667cc78dc16e0481 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,6 +45,7 @@ import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.PsiDocumentManager;
 import com.intellij.util.PairFunction;
+import com.intellij.util.SmartList;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.messages.MessageBus;
 import com.intellij.util.messages.MessageBusConnection;
@@ -74,11 +75,10 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
 
     ((DebuggerManagerEx)debugManager).addDebuggerManagerListener(new DebuggerManagerAdapter() {
       private MessageBusConnection myConn = null;
-      private int mySessionCount = 0;
 
       @Override
       public void sessionAttached(DebuggerSession session) {
-        if (mySessionCount++ == 0) {
+        if (myConn == null) {
           myConn = bus.connect();
           myConn.subscribe(CompilerTopics.COMPILATION_STATUS, new MyCompilationStatusListener());
         }
@@ -86,13 +86,12 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
 
       @Override
       public void sessionDetached(DebuggerSession session) {
-        mySessionCount = Math.max(0, mySessionCount - 1);
-        if (mySessionCount == 0) {
-          final MessageBusConnection conn = myConn;
-          if (conn != null) {
-            Disposer.dispose(conn);
-            myConn = null;
-          }
+        if (!getHotSwappableDebugSessions().isEmpty()) return;
+
+        final MessageBusConnection conn = myConn;
+        if (conn != null) {
+          Disposer.dispose(conn);
+          myConn = null;
         }
       }
     });
@@ -340,13 +339,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
           }
         }
 
-        final List<DebuggerSession> sessions = new ArrayList<DebuggerSession>();
-        Collection<DebuggerSession> debuggerSessions = DebuggerManagerEx.getInstanceEx(myProject).getSessions();
-        for (final DebuggerSession debuggerSession : debuggerSessions) {
-          if (debuggerSession.isAttached() && debuggerSession.getProcess().canRedefineClasses()) {
-            sessions.add(debuggerSession);
-          }
-        }
+        List<DebuggerSession> sessions = getHotSwappableDebugSessions();
         if (!sessions.isEmpty()) {
           hotSwapSessions(sessions, generated);
         }
@@ -354,4 +347,19 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
       myPerformHotswapAfterThisCompilation = true;
     }
   }
+
+  public static boolean canHotSwap(@NotNull DebuggerSession debuggerSession) {
+    return debuggerSession.isAttached() && debuggerSession.getProcess().canRedefineClasses();
+  }
+
+  @NotNull
+  private List<DebuggerSession> getHotSwappableDebugSessions() {
+    final List<DebuggerSession> sessions = new SmartList<DebuggerSession>();
+    for (final DebuggerSession debuggerSession : DebuggerManagerEx.getInstanceEx(myProject).getSessions()) {
+      if (canHotSwap(debuggerSession)) {
+        sessions.add(debuggerSession);
+      }
+    }
+    return sessions;
+  }
 }