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;