Bug564486 - Fix variable evaluation for anon classes and lambdas

The evaluation engine fails when the lambda is inside a anon class and
the evaluation is done inside the lambda. The root cause was the eval
method which is static throws a compilation problem due to it is created
in the anon class. Now the problem is ignored as other problems in
ASTEvaluationEngine

Change-Id: I287cf2d02561e49b90c32f7124c0e1e90d840279
Signed-off-by: gayanper <gayanper@gmail.com>
diff --git a/org.eclipse.jdt.debug.tests/java8/Bug564486.java b/org.eclipse.jdt.debug.tests/java8/Bug564486.java
new file mode 100644
index 0000000..414dc3b
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java8/Bug564486.java
@@ -0,0 +1,14 @@
+import java.util.stream.Stream;
+
+public class Bug564486 {
+    public static void main(String[] args) {
+        new Runnable() {
+            @Override
+            public void run() {
+                Stream.of(1, 2, 3).forEach(i -> {
+                    System.out.println(args);
+                });
+            }
+        }.run();
+    }
+}
\ 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 bcce41a..98a5c47 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
@@ -477,6 +477,7 @@
 				cfgs.add(createLaunchConfiguration(jp, "Bug562056"));
 				cfgs.add(createLaunchConfiguration(jp, "RemoteEvaluator"));
 				cfgs.add(createLaunchConfiguration(jp, "AnonymousEvaluator"));
+				cfgs.add(createLaunchConfiguration(jp, "Bug564486"));
 	    		loaded18 = true;
 	    		waitForBuild();
 	        }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/AnonClassEvalTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/AnonClassEvalTests.java
new file mode 100644
index 0000000..b0ebe0f
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/AnonClassEvalTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Gayan Perera and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Gayan Perera - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.eval;
+
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.debug.core.IJavaThread;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+import org.eclipse.jdt.internal.debug.core.model.JDIObjectValue;
+
+public class AnonClassEvalTests extends AbstractDebugTest {
+	private IJavaThread javaThread;
+
+	@Override
+	protected IJavaProject getProjectContext() {
+		return get18Project();
+	}
+
+	public AnonClassEvalTests(String name) {
+		super(name);
+	}
+
+	public void testEvaluate_OuterVariable_InsideLambda() throws Exception {
+		debugWithBreakpoint("Bug564486", 9);
+		String snippet = "args";
+		IValue value = doEval(javaThread, snippet);
+
+		assertEquals("wrong type : ", "java.lang.String[]", value.getReferenceTypeName());
+		assertEquals("wrong result : ", 0, ((JDIObjectValue) value).getArrayLength());
+	}
+
+	public void testEvaluate_LambdaVariable_InsideLambda() throws Exception {
+		debugWithBreakpoint("Bug564486", 9);
+		String snippet = "i";
+		IValue value = doEval(javaThread, snippet);
+
+		assertEquals("wrong type : ", "java.lang.Integer", value.getReferenceTypeName());
+		assertEquals("wrong result : ", "1", ((JDIObjectValue) value).getField("value", false).getValue().toString());
+	}
+
+	private void debugWithBreakpoint(String testClass, int lineNumber) throws Exception {
+		createLineBreakpoint(lineNumber, testClass);
+		javaThread = launchToBreakpoint(testClass);
+		assertNotNull("The program did not suspend", javaThread);
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		try {
+			terminateAndRemove(javaThread);
+		} finally {
+			super.tearDown();
+			removeAllBreakpoints();
+		}
+	}
+}
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 bdfda78..5196f71 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
@@ -622,7 +622,8 @@
 						|| problemId == IProblem.NotVisibleMethod
 						|| problemId == IProblem.NotVisibleConstructor
 						|| problemId == IProblem.NotVisibleField
-						|| problemId == IProblem.NotVisibleType) {
+						|| problemId == IProblem.NotVisibleType 
+						|| problemId == IProblem.UnexpectedStaticModifierForMethod) {
 					continue;
 				}
 				if (problem.isError()) {