diff options
author | Gayan Perera | 2021-10-28 17:48:13 +0000 |
---|---|---|
committer | Sarika Sinha | 2021-11-01 19:07:15 +0000 |
commit | 39150a4dc8af145c12f350efbcca07eb6a391d51 (patch) | |
tree | 177405420cfe49b2d1c1040479ca7791b802e1fc | |
parent | 6959f9d037b51a7cf5735a9bbbb91bb79366aaa6 (diff) | |
download | eclipse.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>
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) { |