diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/EvaluateRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/EvaluateRequestHandler.java index 30f98d7a8..55174c189 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/EvaluateRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/EvaluateRequestHandler.java @@ -88,7 +88,7 @@ public CompletableFuture handle(Command command, Arguments arguments, } long threadId = stackFrameReference.getThread().uniqueID(); if (value instanceof ObjectReference) { - VariableProxy varProxy = new VariableProxy(stackFrameReference.getThread(), "eval", value); + VariableProxy varProxy = new VariableProxy(stackFrameReference.getThread(), "eval", value, null, expression); int indexedVariables = -1; Value sizeValue = null; if (value instanceof ArrayReference) { diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/ScopesRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/ScopesRequestHandler.java index 375752a3b..e7b1a9485 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/ScopesRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/ScopesRequestHandler.java @@ -45,7 +45,7 @@ public CompletableFuture handle(Command command, Arguments arguments, return CompletableFuture.completedFuture(response); } ThreadReference thread = stackFrameReference.getThread(); - VariableProxy localScope = new VariableProxy(thread, "Local", stackFrameReference); + VariableProxy localScope = new VariableProxy(thread, "Local", stackFrameReference, null, null); int localScopeId = context.getRecyclableIdPool().addObject(thread.uniqueID(), localScope); scopes.add(new Types.Scope(localScope.getScope(), localScopeId, false)); diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/SetVariableRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/SetVariableRequestHandler.java index 568d22c47..c2d3aa1d2 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/SetVariableRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/SetVariableRequestHandler.java @@ -121,7 +121,7 @@ public CompletableFuture handle(Command command, Arguments arguments, if (newValue instanceof ObjectReference && VariableUtils.hasChildren(newValue, showStaticVariables)) { long threadId = ((VariableProxy) container).getThreadId(); String scopeName = ((VariableProxy) container).getScope(); - VariableProxy varProxy = new VariableProxy(((VariableProxy) container).getThread(), scopeName, newValue); + VariableProxy varProxy = new VariableProxy(((VariableProxy) container).getThread(), scopeName, newValue, (VariableProxy) container, name); referenceId = context.getRecyclableIdPool().addObject(threadId, varProxy); } diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/VariablesRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/VariablesRequestHandler.java index 45ed9fc34..6cff05823 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/VariablesRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/VariablesRequestHandler.java @@ -230,14 +230,21 @@ public CompletableFuture handle(Command command, Arguments arguments, } int referenceId = 0; + + boolean containerIsArray = containerNode.getProxiedVariable() instanceof ArrayReference; + String evaluateName; + if (indexedVariables > 0 || (indexedVariables < 0 && VariableUtils.hasChildren(value, showStaticVariables))) { - VariableProxy varProxy = new VariableProxy(containerNode.getThread(), containerNode.getScope(), value); + VariableProxy varProxy = new VariableProxy(containerNode.getThread(), containerNode.getScope(), value, containerNode, javaVariable.name); referenceId = context.getRecyclableIdPool().addObject(containerNode.getThreadId(), varProxy); + evaluateName = varProxy.getEvaluateName(); + } else { + evaluateName = VariableUtils.getEvaluateName(javaVariable.name, containerNode.getEvaluateName(), containerIsArray); } Types.Variable typedVariables = new Types.Variable(name, variableFormatter.valueToString(value, options), variableFormatter.typeToString(value == null ? null : value.type(), options), - referenceId, null); + referenceId, evaluateName); typedVariables.indexedVariables = Math.max(indexedVariables, 0); String detailsValue = null; if (sizeValue != null) { diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableProxy.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableProxy.java index 52c4cd535..249586553 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableProxy.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableProxy.java @@ -13,6 +13,7 @@ import java.util.Objects; +import com.sun.jdi.ArrayReference; import com.sun.jdi.ThreadReference; public class VariableProxy { @@ -20,6 +21,7 @@ public class VariableProxy { private final String scopeName; private Object variable; private int hashCode; + private final String evaluateName; /** * Create a variable reference. @@ -29,11 +31,20 @@ public class VariableProxy { * the scope name * @param variable * the variable object + * @param container + * the variable container, if any + * @param evaluateName + * the variable evaluate name for the container context, if any */ - public VariableProxy(ThreadReference thread, String scopeName, Object variable) { + public VariableProxy(ThreadReference thread, String scopeName, Object variable, VariableProxy container, String evaluateName) { this.thread = thread; this.scopeName = scopeName; this.variable = variable; + + this.evaluateName = VariableUtils.getEvaluateName(evaluateName, + container == null ? null : container.getEvaluateName(), + container != null && container.getProxiedVariable() instanceof ArrayReference); + hashCode = Objects.hash(scopeName, thread, variable); } @@ -78,4 +89,8 @@ public String getScope() { public Object getProxiedVariable() { return variable; } + + public String getEvaluateName() { + return evaluateName; + } } diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableUtils.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableUtils.java index 6362d0cee..c3e9faaf8 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableUtils.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableUtils.java @@ -250,6 +250,33 @@ public static void applyFormatterOptions(Map defaultOptions, boo } } + /** + * Get the name for evaluation of variable. + * + * @param name the variable name, if any + * @param containerName the container name, if any + * @param isArrayElement is the variable an array element? + */ + public static String getEvaluateName(String name, String containerName, boolean isArrayElement) { + if (name == null) { + return null; + } + + if (isArrayElement) { + if (containerName == null) { + return null; + } + + return String.format("%s[%s]", containerName, name); + } + + if (containerName == null) { + return name; + } + + return String.format("%s.%s", containerName, name); + } + private VariableUtils() { }