diff options
author | Tor Norbye <tnorbye@google.com> | 2014-08-21 00:31:02 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-08-16 04:55:08 +0000 |
commit | 9cde0e3c015174898df8b8f3672185941fad4786 (patch) | |
tree | 80a55c7b59c38377216daaada4e8bc47b69ceb9a /java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java | |
parent | 3b37877a2561bf9fbe072253a18688807d523505 (diff) | |
parent | d76e3920c56d37c942092b7dca20fcaded81c0a5 (diff) | |
download | idea-9cde0e3c015174898df8b8f3672185941fad4786.tar.gz |
Merge "Merge remote-tracking branch 'aosp/upstream-master' into merge"
Diffstat (limited to 'java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java')
-rw-r--r-- | java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java | 111 |
1 files changed, 80 insertions, 31 deletions
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 0a691d332207..9cfb2bfde84e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -36,21 +36,30 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiExpression; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.xdebugger.frame.*; import com.intellij.xdebugger.frame.presentation.XRegularValuePresentation; import com.intellij.xdebugger.frame.presentation.XStringValuePresentation; import com.intellij.xdebugger.frame.presentation.XValuePresentation; +import com.intellij.xdebugger.impl.evaluate.XValueCompactPresentation; +import com.intellij.xdebugger.impl.ui.XValueTextProvider; +import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; +import com.sun.jdi.ArrayReference; +import com.sun.jdi.ArrayType; +import com.sun.jdi.Value; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.ArrayList; import java.util.List; /** * @author egor */ -public class JavaValue extends XNamedValue implements NodeDescriptorProvider { +public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XValueTextProvider { private static final Logger LOG = Logger.getInstance(JavaValue.class); private final JavaValue myParent; @@ -74,7 +83,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { 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); @@ -156,7 +165,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { }); } - private static class JavaValuePresentation extends XValuePresentation { + private static class JavaValuePresentation extends XValuePresentation implements XValueCompactPresentation { private final String myValue; private final String myType; private final String myError; @@ -175,6 +184,12 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { @Override public void renderValue(@NotNull XValueTextRenderer renderer) { + renderValue(renderer, null); + } + + @Override + public void renderValue(@NotNull XValueTextRenderer renderer, @Nullable XValueNodeImpl node) { + boolean compact = node != null; if (myError != null) { if (myValue.endsWith(myError)) { renderer.renderValue(myValue.substring(0, myValue.length() - myError.length())); @@ -182,6 +197,34 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { renderer.renderError(myError); } else { + if (compact && node.getValueContainer() instanceof JavaValue) { + final JavaValue container = (JavaValue)node.getValueContainer(); + + if (container.getDescriptor().isArray()) { + final ArrayReference value = (ArrayReference)container.getDescriptor().getValue(); + final ArrayType type = (ArrayType)container.getDescriptor().getType(); + if (type != null) { + final String typeName = type.componentTypeName(); + if (TypeConversionUtil.isPrimitive(typeName) || CommonClassNames.JAVA_LANG_STRING.equals(typeName)) { + int max = CommonClassNames.JAVA_LANG_STRING.equals(typeName) ? 5 : 10; + final List<Value> values = value.getValues(); + int i = 0; + final List<String> vals = new ArrayList<String>(max); + while (i < values.size() && i <= max) { + vals.add(StringUtil.first(values.get(i).toString(), 15, true)); + i++; + } + String more = ""; + if (vals.size() < values.size()) { + more = ", + " + (values.size() - vals.size()) + " more"; + } + + renderer.renderValue("{" + StringUtil.join(vals, ", ") + more + "}"); + return; + } + } + } + } renderer.renderValue(myValue); } } @@ -269,23 +312,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { children.add(create(JavaValue.this, (ValueDescriptorImpl)descriptor, myEvaluationContext, myNodeManager, false)); } else if (descriptor instanceof MessageDescriptor) { - children.add("", new XValue() { - @Override - public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) { - node.setPresentation(null, new XValuePresentation() { - @NotNull - @Override - public String getSeparator() { - return ""; - } - - @Override - public void renderValue(@NotNull XValueTextRenderer renderer) { - renderer.renderValue(descriptor.getLabel()); - } - }, false); - } - }); + children.add(new JavaStackFrame.DummyMessageValueNode(descriptor.getLabel(), null)); } } } @@ -299,19 +326,36 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { } @Override - public void computeSourcePosition(@NotNull XNavigatable navigatable) { - if (myValueDescriptor instanceof FieldDescriptorImpl) { - SourcePosition position = ((FieldDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext()); - if (position != null) { - navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position)); + public void computeSourcePosition(@NotNull final XNavigatable navigatable) { + if (myEvaluationContext.getSuspendContext().isResumed()) return; + myEvaluationContext.getDebugProcess().getManagerThread().schedule(new SuspendContextCommandImpl(myEvaluationContext.getSuspendContext()) { + @Override + public Priority getPriority() { + return Priority.NORMAL; } - } - if (myValueDescriptor instanceof LocalVariableDescriptorImpl) { - SourcePosition position = ((LocalVariableDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext()); - if (position != null) { - navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position)); + + @Override + public void contextAction() throws Exception { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (myValueDescriptor instanceof FieldDescriptorImpl) { + SourcePosition position = ((FieldDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext()); + if (position != null) { + navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position)); + } + } + if (myValueDescriptor instanceof LocalVariableDescriptorImpl) { + SourcePosition position = + ((LocalVariableDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext()); + if (position != null) { + navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position)); + } + } + } + }); } - } + }); } private DebuggerContextImpl getDebuggerContext() { @@ -393,4 +437,9 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider { } return evaluationExpression; } + + @Override + public String getValueText() { + return myValueDescriptor.getValueText(); + } } |