diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ShowReferringObjectsAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ShowReferringObjectsAction.java new file mode 100644 index 000000000000..2df05b6b7fe0 --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ShowReferringObjectsAction.java @@ -0,0 +1,124 @@ +/* + * Copyright 2000-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.debugger.actions; + +import com.intellij.debugger.DebuggerContext; +import com.intellij.debugger.engine.JavaValue; +import com.intellij.debugger.engine.evaluation.EvaluateException; +import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; +import com.intellij.debugger.engine.events.SuspendContextCommandImpl; +import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.psi.PsiExpression; +import com.intellij.xdebugger.frame.*; +import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree; +import com.intellij.xdebugger.impl.ui.tree.XInspectDialog; +import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase; +import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; +import com.sun.jdi.ObjectReference; +import com.sun.jdi.Value; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author egor + */ +public class ShowReferringObjectsAction extends XDebuggerTreeActionBase { + private static final long MAX_REFERRING = 100; + + @Override + public void update(AnActionEvent e) { + super.update(e); + } + + @Override + protected void perform(XValueNodeImpl node, @NotNull String nodeName, AnActionEvent e) { + if (node.getValueContainer() instanceof JavaValue) { + JavaValue javaValue = ((JavaValue)node.getValueContainer()); + XDebuggerTree tree = XDebuggerTree.getTree(e.getDataContext()); + XInspectDialog dialog = new XInspectDialog(tree.getProject(), + tree.getEditorsProvider(), + tree.getSourcePosition(), + nodeName, + new ReferringObjectsValue(javaValue), + tree.getValueMarkers()); + dialog.setTitle("Referring objects for " + nodeName); + dialog.show(); + } + } + + private static class ReferringObjectsValue extends XValue { + private final JavaValue myJavaValue; + + public ReferringObjectsValue(JavaValue javaValue) { + myJavaValue = javaValue; + } + + @Override + public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) { + myJavaValue.computePresentation(node, place); + } + + @Override + public void computeChildren(@NotNull final XCompositeNode node) { + myJavaValue.getEvaluationContext().getDebugProcess().getManagerThread().schedule( + new SuspendContextCommandImpl(myJavaValue.getEvaluationContext().getSuspendContext()) { + @Override + public Priority getPriority() { + return Priority.NORMAL; + } + + @Override + public void contextAction() throws Exception { + final XValueChildrenList children = new XValueChildrenList(); + + Value value = myJavaValue.getDescriptor().getValue(); + List references = ((ObjectReference)value).referringObjects(MAX_REFERRING); + int i = 1; + for (final ObjectReference reference : references) { + ValueDescriptorImpl descriptor = new ValueDescriptorImpl(myJavaValue.getProject(), reference) { + @Override + public Value calcValue(EvaluationContextImpl evaluationContext) throws EvaluateException { + return reference; + } + + @Override + public String getName() { + return "Ref"; + } + + @Override + public String calcValueName() { + return "Ref"; + } + + @Override + public PsiExpression getDescriptorEvaluation(DebuggerContext context) throws EvaluateException { + return null; + } + }; + JavaValue jValue = JavaValue.create(descriptor, myJavaValue.getEvaluationContext(), null); + children.add("Referrer " + i++ ,new ReferringObjectsValue(jValue)); + } + + node.addChildren(children, true); + } + } + ); + } + } +} diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java index 728af065721d..1603ed928ded 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -83,7 +83,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV return new JavaValue(parent, valueDescriptor, evaluationContext, nodeManager); } - static JavaValue create(@NotNull ValueDescriptorImpl valueDescriptor, + public static JavaValue create(@NotNull ValueDescriptorImpl valueDescriptor, EvaluationContextImpl evaluationContext, NodeManagerImpl nodeManager) { return create(null, valueDescriptor, evaluationContext, nodeManager, true); diff --git a/platform/platform-resources-en/src/messages/ActionsBundle.properties b/platform/platform-resources-en/src/messages/ActionsBundle.properties index 47c4cef92207..50500e895c48 100644 --- a/platform/platform-resources-en/src/messages/ActionsBundle.properties +++ b/platform/platform-resources-en/src/messages/ActionsBundle.properties @@ -939,6 +939,7 @@ action.Debugger.Inspect.text=Inspect action.Debugger.CopyValue.text=Copy Value action.Debugger.ViewText.text=View Text action.Debugger.ViewText.description=View text value of selected node in a separate pane +action.Debugger.ShowReferring.text=Show Referring Objects action.Debugger.CompareValueWithClipboard.text=Compare Value with Clipboard action.Debugger.CompareValueWithClipboard.description=Compare value of selected node with clipboard text action.Debugger.CustomizeContextView.text=Customize Data Views... diff --git a/resources/src/idea/JavaActions.xml b/resources/src/idea/JavaActions.xml index 81a791f42208..bcfa7f37dda1 100644 --- a/resources/src/idea/JavaActions.xml +++ b/resources/src/idea/JavaActions.xml @@ -162,6 +162,9 @@ + + +