IDEA-155313 Stack variables requested more than once on the first debugger stop
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 28 Apr 2016 17:41:30 +0000 (20:41 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 28 Apr 2016 17:43:15 +0000 (20:43 +0300)
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchNodeImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java

index 3b3b658182d36e162c4ad199b9103a04d5fef868..1178f11b5e1a6803fab0b545c960d108894eb7cd 100644 (file)
@@ -23,7 +23,6 @@ import com.intellij.ide.dnd.DnDNativeTarget;
 import com.intellij.openapi.CompositeDisposable;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.*;
-import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.ide.CopyPasteManager;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.EmptyRunnable;
@@ -71,7 +70,6 @@ public class XWatchesViewImpl extends XVariablesView implements DnDNativeTarget,
   private WatchesRootNode myRootNode;
 
   private final CompositeDisposable myDisposables = new CompositeDisposable();
-  private boolean myRebuildNeeded;
   private final boolean myWatchesInVariables;
 
   public XWatchesViewImpl(@NotNull XDebugSessionImpl session, boolean watchesInVariables) {
@@ -289,19 +287,8 @@ public class XWatchesViewImpl extends XVariablesView implements DnDNativeTarget,
     }
   }
 
-  public boolean rebuildNeeded() {
-    return myRebuildNeeded;
-  }
-
-  @Override
-  public void processSessionEvent(@NotNull final SessionEvent event) {
-    if (getPanel().isShowing() || ApplicationManager.getApplication().isUnitTestMode()) {
-      myRebuildNeeded = false;
-    }
-    else {
-      myRebuildNeeded = true;
-    }
-    super.processSessionEvent(event);
+  public void computeWatches() {
+    myRootNode.computeWatches();
   }
 
   @Override
index 43266062a9f3f69785d7268439c37808112ad21f..efb8f7796b6b5c22ec7ce6268cf3039429df7ed7 100644 (file)
@@ -71,8 +71,8 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
   private final Runnable myRebuildWatchesRunnable = new Runnable() {
     @Override
     public void run() {
-      if (myWatchesView != null && myWatchesView.rebuildNeeded()) {
-        myWatchesView.processSessionEvent(XDebugView.SessionEvent.SETTINGS_CHANGED);
+      if (myWatchesView != null) {
+        myWatchesView.computeWatches();
       }
     }
   };
index 9606adff63c2985a83cca535bf2e741f44b394b1..e1f44c3ba09a6a5e2dc80756e9a609ce86fc0b2e 100644 (file)
@@ -41,8 +41,7 @@ public class WatchNodeImpl extends XValueNodeImpl implements WatchNode {
                        @NotNull WatchesRootNode parent,
                        @NotNull XExpression expression,
                        @Nullable XStackFrame stackFrame) {
-    super(tree, parent, expression.getExpression(),
-          new XWatchValue(expression, tree.isShowing() || ApplicationManager.getApplication().isUnitTestMode() ? stackFrame : null));
+    super(tree, parent, expression.getExpression(), new XWatchValue(expression, tree, stackFrame));
     myExpression = expression;
   }
 
@@ -60,14 +59,22 @@ public class WatchNodeImpl extends XValueNodeImpl implements WatchNode {
     return value != null ? value : container;
   }
 
+  void computePresentationIfNeeded() {
+    if (getValuePresentation() == null) {
+      getValueContainer().computePresentation(this, XValuePlace.TREE);
+    }
+  }
+
   private static class XWatchValue extends XNamedValue {
     private final XExpression myExpression;
+    private final XDebuggerTree myTree;
     private final XStackFrame myStackFrame;
     private volatile XValue myValue;
 
-    public XWatchValue(XExpression expression, XStackFrame stackFrame) {
+    public XWatchValue(XExpression expression, XDebuggerTree tree, XStackFrame stackFrame) {
       super(expression.getExpression());
       myExpression = expression;
+      myTree = tree;
       myStackFrame = stackFrame;
     }
 
@@ -81,9 +88,11 @@ public class WatchNodeImpl extends XValueNodeImpl implements WatchNode {
     @Override
     public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
       if (myStackFrame != null) {
-        XDebuggerEvaluator evaluator = myStackFrame.getEvaluator();
-        if (evaluator != null) {
-          evaluator.evaluate(myExpression, new MyEvaluationCallback(node, place), myStackFrame.getSourcePosition());
+        if (myTree.isShowing() || ApplicationManager.getApplication().isUnitTestMode()) {
+          XDebuggerEvaluator evaluator = myStackFrame.getEvaluator();
+          if (evaluator != null) {
+            evaluator.evaluate(myExpression, new MyEvaluationCallback(node, place), myStackFrame.getSourcePosition());
+          }
         }
       }
       else {
index f67a2c09f6fa8a08b49a21de33ea0ac90a1fe26a..17795670efbaef8ba444b4526d9345b0d21ee38a 100644 (file)
@@ -99,6 +99,10 @@ public class WatchesRootNode extends XValueContainerNode<XValueContainer> {
     myChildren.clear();
   }
 
+  public void computeWatches() {
+    myChildren.forEach(WatchNodeImpl::computePresentationIfNeeded);
+  }
+
   /**
    * @deprecated Use {@link #addWatchExpression(XStackFrame, XExpression, int, boolean)}
    */