Bug 431716 - [1.8][compiler] NPE when creating LambdaMethod element for
lambda expressions with errors
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaElement8Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaElement8Tests.java
index a81a66c..8d681ba 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaElement8Tests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaElement8Tests.java
@@ -526,4 +526,38 @@
 			deleteProject(projectName);
 		}
 	}
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=431716
+	public void test431716() throws CoreException {
+		String projectName = "Bug431716";
+		try {
+			IJavaProject project = createJavaProject(projectName, new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "1.8");
+			project.open(null);
+			String fileContent = 
+					"public interface X<T> {\n" +
+					"    default void asIntStream() {\n" +
+					"    	mapToInt((long l) -> (int) l);" +
+					"    }\n" +
+					"	default void mapToInt(ToIntFunction<? super T> mapper) {}\n" +
+					"interface ToIntFunction<T> {\n" +
+					"	int applyAsInt(T value);\n" +
+					"}\n";
+			String fileName = "/" + projectName + "/src/X.java";
+			createFile(fileName, fileContent);
+			
+			ICompilationUnit unit = getCompilationUnit(fileName);
+			int start = fileContent.indexOf("l)");
+			IJavaElement[] elements = unit.codeSelect(start, 1);
+			assertEquals("Incorrect java element", IJavaElement.LOCAL_VARIABLE, elements[0].getElementType());
+			String mem = elements[0].getHandleIdentifier();
+			String expected = "=Bug431716/src<{X.java[X~asIntStream@l!72!77!77!77!J!0!true";
+			assertEquals("Incorrect memento", expected, mem);
+			IMethod parent = (IMethod) elements[0].getParent();
+			mem = parent.getHandleIdentifier();
+			expected = "=Bug431716/src<{X.java[X~asIntStream";
+			assertEquals("Incorrect memento", expected, mem);
+		}
+		finally {
+			deleteProject(projectName);
+		}
+	}
 }
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/HandleFactory.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/HandleFactory.java
index 6bb6c17..5f5b847 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/HandleFactory.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/HandleFactory.java
@@ -36,6 +36,7 @@
 import org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
 import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;
 import org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.eclipse.jdt.internal.core.*;
 import org.eclipse.jdt.internal.core.search.AbstractJavaSearchScope;
@@ -209,7 +210,8 @@
 				if (scope.isLambdaScope()) {
 					parentElement = createElement(scope.parent, elementPosition, unit, existingElements, knownScopes);
 					LambdaExpression expression = (LambdaExpression) scope.originalReferenceContext();
-					if (expression.resolvedType != null && expression.resolvedType.isValidBinding()) { // chain in lambda element only if resolved properly.
+					if (expression.resolvedType != null && expression.resolvedType.isValidBinding() && 
+							!(expression.descriptor instanceof ProblemMethodBinding)) { // chain in lambda element only if resolved properly.
 						newElement = new org.eclipse.jdt.internal.core.LambdaExpression((JavaElement) parentElement, expression).getMethod();
 						knownScopes.put(scope, newElement);
 						return newElement;