Skip to content

Commit 73a189f

Browse files
drungrintestforstephen
authored andcommitted
#624 "copy value" from variables debugger window not working
1 parent f420492 commit 73a189f

File tree

6 files changed

+55
-6
lines changed

6 files changed

+55
-6
lines changed

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/EvaluateRequestHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
8888
}
8989
long threadId = stackFrameReference.getThread().uniqueID();
9090
if (value instanceof ObjectReference) {
91-
VariableProxy varProxy = new VariableProxy(stackFrameReference.getThread(), "eval", value);
91+
VariableProxy varProxy = new VariableProxy(stackFrameReference.getThread(), "eval", value, null, expression);
9292
int indexedVariables = -1;
9393
Value sizeValue = null;
9494
if (value instanceof ArrayReference) {

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/ScopesRequestHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
4545
return CompletableFuture.completedFuture(response);
4646
}
4747
ThreadReference thread = stackFrameReference.getThread();
48-
VariableProxy localScope = new VariableProxy(thread, "Local", stackFrameReference);
48+
VariableProxy localScope = new VariableProxy(thread, "Local", stackFrameReference, null, null);
4949
int localScopeId = context.getRecyclableIdPool().addObject(thread.uniqueID(), localScope);
5050
scopes.add(new Types.Scope(localScope.getScope(), localScopeId, false));
5151

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/SetVariableRequestHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
121121
if (newValue instanceof ObjectReference && VariableUtils.hasChildren(newValue, showStaticVariables)) {
122122
long threadId = ((VariableProxy) container).getThreadId();
123123
String scopeName = ((VariableProxy) container).getScope();
124-
VariableProxy varProxy = new VariableProxy(((VariableProxy) container).getThread(), scopeName, newValue);
124+
VariableProxy varProxy = new VariableProxy(((VariableProxy) container).getThread(), scopeName, newValue, (VariableProxy) container, name);
125125
referenceId = context.getRecyclableIdPool().addObject(threadId, varProxy);
126126
}
127127

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/VariablesRequestHandler.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,21 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
237237
}
238238

239239
int referenceId = 0;
240+
241+
boolean containerIsArray = containerNode.getProxiedVariable() instanceof ArrayReference;
242+
String evaluateName;
243+
240244
if (indexedVariables > 0 || (indexedVariables < 0 && VariableUtils.hasChildren(value, showStaticVariables))) {
241-
VariableProxy varProxy = new VariableProxy(containerNode.getThread(), containerNode.getScope(), value);
245+
VariableProxy varProxy = new VariableProxy(containerNode.getThread(), containerNode.getScope(), value, containerNode, javaVariable.name);
242246
referenceId = context.getRecyclableIdPool().addObject(containerNode.getThreadId(), varProxy);
247+
evaluateName = varProxy.getEvaluateName();
248+
} else {
249+
evaluateName = VariableUtils.getEvaluateName(javaVariable.name, containerNode.getEvaluateName(), containerIsArray);
243250
}
244251

245252
Types.Variable typedVariables = new Types.Variable(name, variableFormatter.valueToString(value, options),
246253
variableFormatter.typeToString(value == null ? null : value.type(), options),
247-
referenceId, null);
254+
referenceId, evaluateName);
248255
typedVariables.indexedVariables = Math.max(indexedVariables, 0);
249256
String detailsValue = null;
250257
if (sizeValue != null) {

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableProxy.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313

1414
import java.util.Objects;
1515

16+
import com.sun.jdi.ArrayReference;
1617
import com.sun.jdi.ThreadReference;
1718

1819
public class VariableProxy {
1920
private final ThreadReference thread;
2021
private final String scopeName;
2122
private Object variable;
2223
private int hashCode;
24+
private final String evaluateName;
2325

2426
/**
2527
* Create a variable reference.
@@ -29,11 +31,20 @@ public class VariableProxy {
2931
* the scope name
3032
* @param variable
3133
* the variable object
34+
* @param container
35+
* the variable container, if any
36+
* @param evaluateName
37+
* the variable evaluate name for the container context, if any
3238
*/
33-
public VariableProxy(ThreadReference thread, String scopeName, Object variable) {
39+
public VariableProxy(ThreadReference thread, String scopeName, Object variable, VariableProxy container, String evaluateName) {
3440
this.thread = thread;
3541
this.scopeName = scopeName;
3642
this.variable = variable;
43+
44+
this.evaluateName = VariableUtils.getEvaluateName(evaluateName,
45+
container == null ? null : container.getEvaluateName(),
46+
container != null && container.getProxiedVariable() instanceof ArrayReference);
47+
3748
hashCode = Objects.hash(scopeName, thread, variable);
3849
}
3950

@@ -78,4 +89,8 @@ public String getScope() {
7889
public Object getProxiedVariable() {
7990
return variable;
8091
}
92+
93+
public String getEvaluateName() {
94+
return evaluateName;
95+
}
8196
}

Diff for: com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/variables/VariableUtils.java

+27
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,33 @@ public static void applyFormatterOptions(Map<String, Object> defaultOptions, boo
256256
}
257257
}
258258

259+
/**
260+
* Get the name for evaluation of variable.
261+
*
262+
* @param name the variable name, if any
263+
* @param containerName the container name, if any
264+
* @param isArrayElement is the variable an array element?
265+
*/
266+
public static String getEvaluateName(String name, String containerName, boolean isArrayElement) {
267+
if (name == null) {
268+
return null;
269+
}
270+
271+
if (isArrayElement) {
272+
if (containerName == null) {
273+
return null;
274+
}
275+
276+
return String.format("%s[%s]", containerName, name);
277+
}
278+
279+
if (containerName == null) {
280+
return name;
281+
}
282+
283+
return String.format("%s.%s", containerName, name);
284+
}
285+
259286
private VariableUtils() {
260287

261288
}

0 commit comments

Comments
 (0)