Bug 576829 - Fix evaluations for variables with recursive generic

Add new test case to make sure multiple recursive generic parameters
works.

Change-Id: I6aaa7f9b867cdda6a889c9d3b75b906a040dd820
Signed-off-by: Gayan Perera <gayanper@gmail.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.debug/+/187240
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Sebastian Zarnekow <sebastian.zarnekow@gmail.com>
Reviewed-by: Sarika Sinha <sarika.sinha@in.ibm.com>
diff --git a/org.eclipse.jdt.debug.tests/java7/Bug576829.java b/org.eclipse.jdt.debug.tests/java7/Bug576829.java
index 4d0aad5..f59b0c2 100644
--- a/org.eclipse.jdt.debug.tests/java7/Bug576829.java
+++ b/org.eclipse.jdt.debug.tests/java7/Bug576829.java
@@ -7,6 +7,7 @@
 	
 	public static void main(String[] args) {
 		MyClass<?> cls = new MyClass<>();
+		MyClass1<?,?> cls1 = new MyClass1<>();
 		List<? extends Number> num = new ArrayList<>();
 		System.out.println("x"); // add conditional breakpoint here (e.g. "cls.getBoolean()")
 	}
@@ -17,4 +18,11 @@
 			return false;
 		}
 	}
+	
+	private static class MyClass1<C1 extends MyClass1<C1, C2>, C2 extends MyClass1<C1, C2>> {
+		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/eval/GenericsEval17Test.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/GenericsEval17Test.java
index de80380..1ee424e 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
@@ -118,7 +118,7 @@
 	}
 
 	public void testEvaluate_Bug576829_RecursiveGenerics_ObjectInstanceEvaluation() throws Exception {
-		createConditionalLineBreakpoint(11, "Bug576829", "cls.getBoolean() && num.isEmpty()", false);
+		createConditionalLineBreakpoint(12, "Bug576829", "cls.getBoolean() && num.isEmpty()", false);
 		javaThread = launchToBreakpoint("Bug576829");
 		assertNotNull("The program did not suspend", javaThread);
 
@@ -129,6 +129,18 @@
 		assertEquals("value is not false", "false", value.getValueString());
 	}
 
+	public void testEvaluate_Bug576829_RecursiveMultipleGenerics_ObjectInstanceEvaluation() throws Exception {
+		createConditionalLineBreakpoint(12, "Bug576829", "cls1.getBoolean() && num.isEmpty()", false);
+		javaThread = launchToBreakpoint("Bug576829");
+		assertNotNull("The program did not suspend", javaThread);
+
+		String snippet = "cls1.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);