From 07f5fde0b2673d98e2670fa3c25d45121e593e79 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 26 Aug 2014 17:32:43 +0400 Subject: [PATCH] show correctly evaluated watches in variables view - initial --- .../util/resources/misc/registry.properties | 1 + .../xdebugger/impl/XDebugSessionImpl.java | 4 ++ .../impl/ui/tree/nodes/XStackFrameNode.java | 37 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 8783e16271c8..d5fc17823969 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -160,6 +160,7 @@ debugger.breakpoint.message.full.trace.description='Log message to console' brea for the thread that hit the breakpoint. debugger.batch.evaluation=false debugger.compiling.evaluator=false +debugger.watches.in.variables=false analyze.exceptions.on.the.fly=false analyze.exceptions.on.the.fly.description=Automatically analyze clipboard on frame activation,\ diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java index 28d4c5ed1425..a3fa4327a7fd 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java @@ -45,6 +45,7 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.ui.AppUIUtil; @@ -971,6 +972,9 @@ public class XDebugSessionImpl implements XDebugSession { public void setWatchExpressions(@NotNull XExpression[] watchExpressions) { mySessionData.setWatchExpressions(watchExpressions); myDebuggerManager.getWatchesManager().setWatches(getWatchesKey(), watchExpressions); + if (Registry.is("debugger.watches.in.variables")) { + rebuildViews(); + } } XExpression[] getWatchExpressions() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java index fa32ebcc4d75..b7b21560f438 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XStackFrameNode.java @@ -15,7 +15,16 @@ */ package com.intellij.xdebugger.impl.ui.tree.nodes; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.xdebugger.XDebugSession; +import com.intellij.xdebugger.XExpression; +import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; import com.intellij.xdebugger.frame.XStackFrame; +import com.intellij.xdebugger.frame.XValue; +import com.intellij.xdebugger.frame.XValueChildrenList; +import com.intellij.xdebugger.impl.XDebugSessionImpl; +import com.intellij.xdebugger.impl.frame.XDebugView; +import com.intellij.xdebugger.impl.ui.XDebugSessionData; import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree; import org.jetbrains.annotations.NotNull; @@ -27,4 +36,32 @@ public class XStackFrameNode extends XValueContainerNode { super(tree, null, xStackFrame); setLeaf(false); } + + @Override + public void startComputingChildren() { + if (Registry.is("debugger.watches.in.variables")) { + XDebugSession session = XDebugView.getSession(getTree()); + XDebuggerEvaluator evaluator = getValueContainer().getEvaluator(); + if (session != null && evaluator != null) { + XDebugSessionData data = ((XDebugSessionImpl)session).getSessionData(); + XExpression[] expressions = data.getWatchExpressions(); + for (final XExpression expression : expressions) { + evaluator.evaluate(expression, new XDebuggerEvaluator.XEvaluationCallback() { + @Override + public void evaluated(@NotNull XValue result) { + XValueChildrenList watches = new XValueChildrenList(); + watches.add(expression.getExpression(), result); + addChildren(watches, false); + } + + @Override + public void errorOccurred(@NotNull String errorMessage) { + // do not add anything + } + }, getValueContainer().getSourcePosition()); + } + } + } + super.startComputingChildren(); + } }