Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGayan Perera2021-10-28 17:48:13 +0000
committerSarika Sinha2021-11-01 19:07:15 +0000
commit39150a4dc8af145c12f350efbcca07eb6a391d51 (patch)
tree177405420cfe49b2d1c1040479ca7791b802e1fc
parent6959f9d037b51a7cf5735a9bbbb91bb79366aaa6 (diff)
downloadeclipse.jdt.debug-39150a4dc8af145c12f350efbcca07eb6a391d51.tar.gz
eclipse.jdt.debug-39150a4dc8af145c12f350efbcca07eb6a391d51.tar.xz
eclipse.jdt.debug-39150a4dc8af145c12f350efbcca07eb6a391d51.zip
Bug 576829 - Fix evaluations for variables with recursive genericI20211101-1800
The variable types received from the debugger doesn't contains the correct generic bounds nor type params for recursive type params, this cause a compilation issue in the generated snippet source. The fix tries to find the correct generic types/bounds from the AST and apply them into variables that are added into generated eval method. Change-Id: Ie136a4a54d6e855d75d717380e9086f1d296a115 Signed-off-by: Gayan Perera <gayanper@gmail.com> Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.debug/+/187132 Tested-by: JDT Bot <jdt-bot@eclipse.org> Reviewed-by: Sarika Sinha <sarika.sinha@in.ibm.com>
-rw-r--r--org.eclipse.jdt.debug.tests/java7/Bug576829.java20
-rw-r--r--org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java1
-rw-r--r--org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java12
-rw-r--r--org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java6
4 files changed, 38 insertions, 1 deletions
diff --git a/org.eclipse.jdt.debug.tests/java7/Bug576829.java b/org.eclipse.jdt.debug.tests/java7/Bug576829.java
new file mode 100644
index 000000000..4d0aad584
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java7/Bug576829.java
@@ -0,0 +1,20 @@
+import java.util.ArrayList;
+import java.util.List;
+
+import Bug576829.MyClass;
+
+public class Bug576829 {
+
+ public static void main(String[] args) {
+ MyClass<?> cls = new MyClass<>();
+ List<? extends Number> num = new ArrayList<>();
+ System.out.println("x"); // add conditional breakpoint here (e.g. "cls.getBoolean()")
+ }
+
+ private static class MyClass<T extends MyClass<T>> {
+
+ public boolean getBoolean() {
+ return false;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
index b879fab5c..f2fcc6842 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
@@ -440,6 +440,7 @@ public abstract class AbstractDebugTest extends TestCase implements IEvaluation
cfgs.add(createLaunchConfiguration(jp, "ThreadNameChange"));
cfgs.add(createLaunchConfiguration(jp, "Bug567801"));
cfgs.add(createLaunchConfiguration(jp, "Bug572782"));
+ cfgs.add(createLaunchConfiguration(jp, "Bug576829"));
loaded17 = true;
waitForBuild();
}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java
index c4c32fef7..de80380e6 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java
@@ -117,6 +117,18 @@ public class GenericsEval17Test extends AbstractDebugTest {
assertEquals("value is not 3", "3", value.getValueString());
}
+ public void testEvaluate_Bug576829_RecursiveGenerics_ObjectInstanceEvaluation() throws Exception {
+ createConditionalLineBreakpoint(11, "Bug576829", "cls.getBoolean() && num.isEmpty()", false);
+ javaThread = launchToBreakpoint("Bug576829");
+ assertNotNull("The program did not suspend", javaThread);
+
+ String snippet = "cls.getBoolean() && num.isEmpty()";
+ IValue value = doEval(javaThread, snippet);
+
+ assertNotNull("value is null", value);
+ assertEquals("value is not false", "false", value.getValueString());
+ }
+
private void debugWithBreakpoint(String testClass, int lineNumber) throws Exception {
createLineBreakpoint(lineNumber, testClass);
javaThread = launchToBreakpoint(testClass);
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
index dc3a3eef3..82f5ff9fd 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/ast/engine/ASTEvaluationEngine.java
@@ -428,7 +428,6 @@ public class ASTEvaluationEngine implements IAstEvaluationEngine {
*/
if (genericSignature.startsWith(String.valueOf(Signature.C_TYPE_VARIABLE)) ||
genericSignature.startsWith(String.valueOf(Signature.C_CAPTURE)) ||
- genericSignature.startsWith(String.valueOf(Signature.C_STAR)) ||
genericSignature.startsWith(String.valueOf(Signature.C_SUPER)))
{
fixedSignature.append(toDotQualified(erasureSignature));
@@ -445,6 +444,11 @@ public class ASTEvaluationEngine implements IAstEvaluationEngine {
String[] typeArguments = Signature.getTypeArguments(genericSignature);
if (typeArguments.length > 0) {
+ if (typeArguments.length == 1 && typeArguments[0].equals(String.valueOf(Signature.C_STAR))) {
+ // this is when we have recursive generics, so remove the generics to avoid compilation issues.
+ return;
+ }
+
fixedSignature.append(Signature.C_GENERIC_START);
for (int i = 0; i < typeArguments.length; i++) {
if (i > 0) {

Back to the top