Bug564801 - Fix generic type resolution issue in generate eval method

Change-Id: I19d57aca58dd49e87c7d3c2545a7b81549eb10d6
Signed-off-by: gayanper <gayanper@gmail.com>
diff --git a/org.eclipse.jdt.debug.tests/java8/Bug564801.java b/org.eclipse.jdt.debug.tests/java8/Bug564801.java
new file mode 100644
index 0000000..66a0cf7
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java8/Bug564801.java
@@ -0,0 +1,18 @@
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Predicate;
+
+public class Bug564801 {
+    public static void main(final String[] args) {
+        Arrays.asList(1,2).sort((a, b) -> {
+            return a.compareTo(b);
+        });
+
+		Arrays.<List<Integer>> asList(Arrays.asList(1), Collections.emptyList()).stream().filter(p -> {
+        	Predicate<? extends List<Integer>> predicate = p1 -> p1.isEmpty();
+			return p.isEmpty();
+        }).count();
+
+    }
+}
\ 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 295b424..55490c5 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
@@ -478,6 +478,7 @@
 				cfgs.add(createLaunchConfiguration(jp, "RemoteEvaluator"));
 				cfgs.add(createLaunchConfiguration(jp, "AnonymousEvaluator"));
 				cfgs.add(createLaunchConfiguration(jp, "Bug564486"));
+				cfgs.add(createLaunchConfiguration(jp, "Bug564801"));
 	    		loaded18 = true;
 	    		waitForBuild();
 	        }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
index 621b316..4ff72ea 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/LambdaVariableTest.java
@@ -48,6 +48,22 @@
 		assertEquals("wrong result : ", "Hello bug 562056", value.getValueString());
 	}
 
+	public void testEvaluate_WithGenericTypeVariables_SuperType() throws Exception {
+		debugWithBreakpoint("Bug564801", 9);
+		String snippet = "a.compareTo(b)";
+		IValue value = doEval(javaThread, snippet);
+
+		assertEquals("Actual value is not 1", "1", value.toString());
+	}
+
+	public void testEvaluate_WithGenericTypeVariables_ExtendsType() throws Exception {
+		debugWithBreakpoint("Bug564801", 14);
+		String snippet = "predicate.test(p)";
+		IValue value = doEval(javaThread, snippet);
+
+		assertEquals("Actual value is not false", "false", value.toString());
+	}
+
 	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 52d9a54..edb4f8a 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
@@ -409,7 +409,8 @@
 
 		final String genericSignature = variable.getGenericSignature();
 		final String fqn = Signature.toString(genericSignature).replace('/', '.');
-		if (genericSignature.startsWith(String.valueOf(Signature.C_TYPE_VARIABLE))) {
+		if (genericSignature.startsWith(String.valueOf(Signature.C_TYPE_VARIABLE))
+				|| Signature.getTypeArguments(genericSignature).length > 0) {
 			// resolve to the signature of the variable.
 			return Signature.toString(variable.getSignature()).replace('/', '.');
 		}