mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
some pretty-printing
This commit is contained in:
@@ -4,19 +4,12 @@ import com.intellij.debugger.ui.tree.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: lex
|
||||
* Date: Mar 17, 2004
|
||||
* Time: 7:47:10 PM
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public interface ChildrenBuilder {
|
||||
NodeDescriptorFactory getDescriptorManager();
|
||||
NodeManager getNodeManager ();
|
||||
NodeDescriptorFactory getDescriptorManager();
|
||||
|
||||
NodeManager getNodeManager();
|
||||
|
||||
ValueDescriptor getParentDescriptor ();
|
||||
ValueDescriptor getParentDescriptor();
|
||||
|
||||
void setChildren(List<DebuggerTreeNode> children);
|
||||
|
||||
}
|
||||
|
||||
@@ -11,11 +11,6 @@ import com.intellij.debugger.DebuggerContext;
|
||||
import com.sun.jdi.Value;
|
||||
import com.sun.tools.corba.se.idl.constExpr.EvaluationException;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 20, 2003
|
||||
* Time: 10:12:01 PM
|
||||
*/
|
||||
public interface ChildrenRenderer extends Renderer {
|
||||
ChildrenRenderer clone();
|
||||
|
||||
@@ -27,13 +22,13 @@ public interface ChildrenRenderer extends Renderer {
|
||||
* + node
|
||||
* + ...
|
||||
*
|
||||
* function is invoked for the renderer in parenNode
|
||||
* returns expression that evaluates node
|
||||
* use 'this' to refer expression that evaluate parentNode
|
||||
@param node -
|
||||
* is invoked on the renderer of the parentNode
|
||||
* @param node a child node
|
||||
* @return expression that evaluates the child node.
|
||||
* Use 'this' to refer the expression that evaluates this (parent) node
|
||||
* @param context
|
||||
*/
|
||||
PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException;
|
||||
PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException;
|
||||
|
||||
boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor);
|
||||
}
|
||||
|
||||
@@ -30,10 +30,10 @@ public class CompoundNodeRenderer implements NodeRenderer{
|
||||
public static final String UNIQUE_ID = "CompoundNodeRenderer";
|
||||
|
||||
private String myName;
|
||||
private RendererProvider myRendererProvider;
|
||||
private RendererProvider myRendererProvider;
|
||||
|
||||
protected ValueLabelRenderer myLabelRenderer;
|
||||
protected ChildrenRenderer myChildrenRenderer;
|
||||
protected ValueLabelRenderer myLabelRenderer;
|
||||
protected ChildrenRenderer myChildrenRenderer;
|
||||
|
||||
public CompoundNodeRenderer(RendererProvider provider, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
|
||||
myRendererProvider = provider;
|
||||
@@ -75,8 +75,8 @@ public class CompoundNodeRenderer implements NodeRenderer{
|
||||
getChildrenRenderer().buildChildren(value, builder, evaluationContext);
|
||||
}
|
||||
|
||||
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
return getChildrenRenderer().getChildrenValueExpression(node, context);
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
return getChildrenRenderer().getChildValueExpression(node, context);
|
||||
}
|
||||
|
||||
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
|
||||
@@ -109,7 +109,9 @@ public class CompoundNodeRenderer implements NodeRenderer{
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
myName = element.getAttributeValue("NAME");
|
||||
if(myName == null) myName = "<unknown>";
|
||||
if(myName == null) {
|
||||
myName = "<unknown>";
|
||||
}
|
||||
List<Element> children = element.getChildren();
|
||||
myLabelRenderer = (ValueLabelRenderer) NodeRendererExternalizer.readRenderer(children.get(0));
|
||||
myChildrenRenderer = (ChildrenRenderer) NodeRendererExternalizer.readRenderer(children.get(1));
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.openapi.util.JDOMExternalizable;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
|
||||
@@ -4,11 +4,6 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.JDOMExternalizable;
|
||||
import com.sun.jdi.Type;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Nov 19, 2003
|
||||
* Time: 5:39:53 PM
|
||||
*/
|
||||
public interface Renderer extends Cloneable, JDOMExternalizable {
|
||||
RendererProvider getRendererProvider();
|
||||
|
||||
@@ -17,9 +12,8 @@ public interface Renderer extends Cloneable, JDOMExternalizable {
|
||||
/***
|
||||
* Checks whether this renderer is apllicable to this value
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public boolean isApplicable(Type type);
|
||||
public boolean isApplicable(Type type);
|
||||
|
||||
public Object clone() throws CloneNotSupportedException;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public abstract class TreeBuilder implements TreeModel {
|
||||
return userObject;
|
||||
}
|
||||
|
||||
protected abstract void buildChildren(TreeBuilderNode node);
|
||||
protected abstract void buildChildren(TreeBuilderNode node);
|
||||
protected abstract boolean isExpandable (TreeBuilderNode node);
|
||||
|
||||
public void setRoot(TreeBuilderNode root) {
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.intellij.debugger.ui.impl.DebuggerTreeBase;
|
||||
import com.intellij.debugger.ui.impl.tree.TreeBuilder;
|
||||
import com.intellij.debugger.ui.impl.tree.TreeBuilderNode;
|
||||
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptor;
|
||||
import com.intellij.debugger.ui.tree.render.ChildrenBuilder;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettingsListener;
|
||||
@@ -66,8 +67,11 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
|
||||
myDescriptorManager = new NodeManagerImpl(project, this);
|
||||
TreeBuilder model = new TreeBuilder(this) {
|
||||
protected void buildChildren(TreeBuilderNode node) {
|
||||
if (((DebuggerTreeNodeImpl)node).getDescriptor() instanceof DefaultNodeDescriptor) return;
|
||||
buildNode((DebuggerTreeNodeImpl)node);
|
||||
final DebuggerTreeNodeImpl debuggerTreeNode = (DebuggerTreeNodeImpl)node;
|
||||
if (debuggerTreeNode.getDescriptor() instanceof DefaultNodeDescriptor) {
|
||||
return;
|
||||
}
|
||||
buildNode(debuggerTreeNode);
|
||||
}
|
||||
|
||||
protected boolean isExpandable(TreeBuilderNode builderNode) {
|
||||
@@ -145,7 +149,9 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
|
||||
|
||||
|
||||
private void buildNode(final DebuggerTreeNodeImpl node) {
|
||||
if (node == null || node.getDescriptor() == null) return;
|
||||
if (node == null || node.getDescriptor() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
BuildNodeCommand builder = getBuildNodeCommand(node);
|
||||
builder.getNode().add(myDescriptorManager.createMessageNode(MessageDescriptor.EVALUATING));
|
||||
@@ -526,28 +532,32 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
|
||||
|
||||
public void threadAction() {
|
||||
try {
|
||||
StackFrameDescriptorImpl stackDescriptor = (StackFrameDescriptorImpl)getNode().getDescriptor();
|
||||
StackFrameProxyImpl frame = stackDescriptor.getStackFrame();
|
||||
if(!getDebuggerContext().getDebugProcess().getSuspendManager().isSuspended(frame.threadProxy())) return;
|
||||
final StackFrameDescriptorImpl stackDescriptor = (StackFrameDescriptorImpl)getNode().getDescriptor();
|
||||
final StackFrameProxyImpl frame = stackDescriptor.getStackFrame();
|
||||
final DebuggerContextImpl debuggerContext = getDebuggerContext();
|
||||
if(!debuggerContext.getDebugProcess().getSuspendManager().isSuspended(frame.threadProxy())) {
|
||||
return;
|
||||
}
|
||||
|
||||
LOG.assertTrue(frame.threadProxy().isSuspended());
|
||||
final ObjectReference thisObjectReference = frame.thisObject();
|
||||
|
||||
ObjectReference thisObjectReference = frame.thisObject();
|
||||
|
||||
EvaluationContextImpl evaluationContext = getDebuggerContext().createEvaluationContext();
|
||||
final EvaluationContextImpl evaluationContext = debuggerContext.createEvaluationContext();
|
||||
|
||||
final NodeDescriptor descriptor;
|
||||
if (thisObjectReference != null) {
|
||||
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getThisDescriptor(stackDescriptor, thisObjectReference), evaluationContext));
|
||||
descriptor = myDescriptorManager.getThisDescriptor(stackDescriptor, thisObjectReference);
|
||||
}
|
||||
else {
|
||||
ReferenceType type = frame.location().method().declaringType();
|
||||
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getStaticDescriptor(stackDescriptor, type), evaluationContext));
|
||||
final ReferenceType type = frame.location().method().declaringType();
|
||||
descriptor = myDescriptorManager.getStaticDescriptor(stackDescriptor, type);
|
||||
}
|
||||
myChildren.add(myDescriptorManager.createNode(descriptor, evaluationContext));
|
||||
try {
|
||||
for (Iterator<LocalVariableProxyImpl> iterator = frame.visibleVariables().iterator(); iterator.hasNext();) {
|
||||
LocalVariableProxyImpl local = iterator.next();
|
||||
|
||||
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getLocalVariableDescriptor(stackDescriptor, local), evaluationContext));
|
||||
final LocalVariableProxyImpl local = iterator.next();
|
||||
final LocalVariableDescriptorImpl localVariableDescriptor = myDescriptorManager.getLocalVariableDescriptor(stackDescriptor, local);
|
||||
final DebuggerTreeNodeImpl variableNode = myDescriptorManager.createNode(localVariableDescriptor, evaluationContext);
|
||||
myChildren.add(variableNode);
|
||||
}
|
||||
}
|
||||
catch (EvaluateException e) {
|
||||
|
||||
@@ -113,39 +113,37 @@ public class DebuggerTreeNodeImpl extends TreeBuilderNode implements DebuggerTre
|
||||
}
|
||||
|
||||
labelChanged();
|
||||
if(!labelOnly) childrenChanged();
|
||||
if(!labelOnly) {
|
||||
childrenChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void calcLabel() {
|
||||
final DebuggerContextImpl context = getTree().getDebuggerContext();
|
||||
update(
|
||||
context,
|
||||
new Runnable() {
|
||||
public void run() {
|
||||
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
|
||||
public void labelChanged() {
|
||||
updateCaches();
|
||||
DebuggerTreeNodeImpl.this.labelChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, true);
|
||||
update(context, new Runnable() {
|
||||
public void run() {
|
||||
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
|
||||
public void labelChanged() {
|
||||
updateCaches();
|
||||
DebuggerTreeNodeImpl.this.labelChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, true);
|
||||
}
|
||||
|
||||
public void calcRepresentation() {
|
||||
final DebuggerContextImpl context = getTree().getDebuggerContext();
|
||||
update(
|
||||
context,
|
||||
new Runnable() {
|
||||
public void run() {
|
||||
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
|
||||
public void labelChanged() {
|
||||
updateCaches();
|
||||
DebuggerTreeNodeImpl.this.labelChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
update(context, new Runnable() {
|
||||
public void run() {
|
||||
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
|
||||
public void labelChanged() {
|
||||
updateCaches();
|
||||
DebuggerTreeNodeImpl.this.labelChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
|
||||
public void calcValue() {
|
||||
|
||||
@@ -52,12 +52,18 @@ public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDes
|
||||
// this field actually mirrors a local variable in the outer class
|
||||
String varName = fieldName.substring(fieldName.lastIndexOf('$') + 1);
|
||||
PsiElement element = PositionUtil.getContextElement(context);
|
||||
if (element == null) return null;
|
||||
if (element == null) {
|
||||
return null;
|
||||
}
|
||||
PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class, false);
|
||||
if (aClass == null) return null;
|
||||
if (aClass == null) {
|
||||
return null;
|
||||
}
|
||||
aClass = (PsiClass) aClass.getNavigationElement();
|
||||
PsiVariable psiVariable = psiManager.getResolveHelper().resolveReferencedVariable(varName, aClass);
|
||||
if (psiVariable == null) return null;
|
||||
if (psiVariable == null) {
|
||||
return null;
|
||||
}
|
||||
return SourcePosition.createFromOffset(psiVariable.getContainingFile(), psiVariable.getTextOffset());
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -189,8 +189,9 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements
|
||||
public NodeRenderer getRenderer (DebugProcessImpl debugProcess) {
|
||||
DebuggerManagerThreadImpl.assertIsManagerThread();
|
||||
Type type = getType();
|
||||
if(type != null && myRenderer != null && myRenderer.isApplicable(type))
|
||||
if(type != null && myRenderer != null && myRenderer.isApplicable(type)) {
|
||||
return myRenderer;
|
||||
}
|
||||
|
||||
myAutoRenderer = debugProcess.getNodeRendererManager().getAutoRenderer(this);
|
||||
return myAutoRenderer;
|
||||
@@ -210,7 +211,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements
|
||||
PsiExpression parentEvaluation = vDescriptor.getTreeEvaluation((DebuggerTreeNodeImpl)debuggerTreeNode.getParent(), context);
|
||||
|
||||
return DebuggerTreeNodeExpression.substituteThis(
|
||||
vDescriptor.getRenderer(context.getDebugProcess()).getChildrenValueExpression(debuggerTreeNode, context),
|
||||
vDescriptor.getRenderer(context.getDebugProcess()).getChildValueExpression(debuggerTreeNode, context),
|
||||
parentEvaluation, vDescriptor.getValue());
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -159,7 +159,7 @@ public class ArrayRenderer extends ReferenceRenderer implements NodeRenderer, Cl
|
||||
DefaultJDOMExternalizer.writeExternal(this, element);
|
||||
}
|
||||
|
||||
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) {
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) {
|
||||
LOG.assertTrue(node.getDescriptor() instanceof ArrayElementDescriptorImpl, node.getDescriptor().getClass().getName());
|
||||
ArrayElementDescriptorImpl descriptor = (ArrayElementDescriptorImpl)node.getDescriptor();
|
||||
|
||||
|
||||
@@ -79,7 +79,8 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
}
|
||||
else if(value == null) {
|
||||
return "null";
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return "undefined";
|
||||
}
|
||||
}
|
||||
@@ -87,7 +88,7 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) {
|
||||
DebuggerManagerThreadImpl.assertIsManagerThread();
|
||||
final ValueDescriptorImpl parentDescriptor = (ValueDescriptorImpl)builder.getParentDescriptor();
|
||||
final NodeManager nodeManager = builder.getNodeManager();
|
||||
final NodeManager nodeManager = builder.getNodeManager();
|
||||
final NodeDescriptorFactory nodeDescriptorFactory = builder.getDescriptorManager();
|
||||
|
||||
List<DebuggerTreeNode> children = new ArrayList<DebuggerTreeNode>();
|
||||
@@ -95,18 +96,21 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
final ObjectReference objRef = (ObjectReference)value;
|
||||
final ReferenceType refType = objRef.referenceType();
|
||||
// default ObjectReference processing
|
||||
List fields = refType.allFields();
|
||||
final List fields = refType.allFields();
|
||||
if (fields.size() > 0) {
|
||||
for (Iterator it = fields.iterator(); it.hasNext();) {
|
||||
Field jdiField = (Field)it.next();
|
||||
if (!shouldDisplay(jdiField)) continue;
|
||||
if (!shouldDisplay(jdiField)) {
|
||||
continue;
|
||||
}
|
||||
children.add(nodeManager.createNode(nodeDescriptorFactory.getFieldDescriptor(parentDescriptor, objRef, jdiField), evaluationContext));
|
||||
}
|
||||
|
||||
if(SORT_ASCENDING) {
|
||||
Collections.sort(children, NodeManagerImpl.getNodeComparator());
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
children.add(nodeManager.createMessageNode(MessageDescriptor.CLASS_HAS_NO_FIELDS.getLabel()));
|
||||
}
|
||||
}
|
||||
@@ -146,7 +150,7 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
DefaultJDOMExternalizer.writeExternal(this, element);
|
||||
}
|
||||
|
||||
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
FieldDescriptor fieldDescriptor = (FieldDescriptor)node.getDescriptor();
|
||||
|
||||
PsiElementFactory elementFactory = PsiManager.getInstance(node.getProject()).getElementFactory();
|
||||
@@ -162,7 +166,8 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
try {
|
||||
if(value instanceof ArrayReference) {
|
||||
return ((ArrayReference)value).length() > 0;
|
||||
} else if(value instanceof ObjectReference) {
|
||||
}
|
||||
else if(value instanceof ObjectReference) {
|
||||
return ((ObjectReference)value).referenceType().allFields().size() > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,8 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
|
||||
Value value = valueDescriptor.getValue();
|
||||
if(value == null) {
|
||||
return "null";
|
||||
} else if (value instanceof PrimitiveValue) {
|
||||
}
|
||||
else if (value instanceof PrimitiveValue) {
|
||||
StringBuffer buf = new StringBuffer(16);
|
||||
if (value instanceof CharValue) {
|
||||
buf.append("'");
|
||||
@@ -91,7 +92,8 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
|
||||
buf.append(DebuggerUtilsEx.translateStringValue(value.toString()));
|
||||
}
|
||||
return buf.toString();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return "undefined";
|
||||
}
|
||||
}
|
||||
@@ -116,7 +118,7 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) {
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) {
|
||||
LOG.assertTrue(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user