Bug 511071 - [1.8] NPE in analyseCode caused by missing type detected in
lambda
Change-Id: I32c80a5a60ac961d41a9cce53e15a5fa152bfe53
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index 6831c3a..c196a9e 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -7853,4 +7853,55 @@
"}\n"
});
}
+ public void testBug511071() {
+ runNegativeTest(
+ new String[] {
+ "test/ATestClass.java",
+ "package test;\n" +
+ "\n" +
+ "interface Functional<T> {\n" +
+ " void test(T t);\n" +
+ "}\n" +
+ "\n" +
+ "public abstract class ATestClass {\n" +
+ " abstract void f(Functional<? super ClassWithMethodWithMissingArgType> predicate);\n" +
+ "\n" +
+ " public void m() {\n" +
+ " f(e -> e.matches(\"\"));\n" +
+ " }\n" +
+ "}\n" +
+ "",
+ "test/ClassWithMethodWithMissingArgType.java",
+ "package test;\n" +
+ "\n" +
+ "import java.util.List;\n" +
+ "\n" +
+ "import missing.Type;\n" +
+ "\n" +
+ "public class ClassWithMethodWithMissingArgType {\n" +
+ " public void matches(Type arg) {\n" +
+ " arg.hashCode();\n" +
+ " }\n" +
+ "}\n" +
+ "",
+ },
+ "----------\n" +
+ "1. ERROR in test\\ATestClass.java (at line 11)\n" +
+ " f(e -> e.matches(\"\"));\n" +
+ " ^^^^^^^\n" +
+ "The method matches(Type) from the type ClassWithMethodWithMissingArgType refers to the missing type Type\n" +
+ "----------\n" +
+ "----------\n" +
+ "1. ERROR in test\\ClassWithMethodWithMissingArgType.java (at line 5)\n" +
+ " import missing.Type;\n" +
+ " ^^^^^^^\n" +
+ "The import missing cannot be resolved\n" +
+ "----------\n" +
+ "2. ERROR in test\\ClassWithMethodWithMissingArgType.java (at line 8)\n" +
+ " public void matches(Type arg) {\n" +
+ " ^^^^\n" +
+ "Type cannot be resolved to a type\n" +
+ "----------\n"
+ );
+ }
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
index be3d0db..20fd791 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
@@ -52,6 +52,7 @@
import java.util.Iterator;
import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
@@ -69,6 +70,7 @@
import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
import org.eclipse.jdt.internal.compiler.util.Util;
@@ -1809,8 +1811,18 @@
}
return null; // should never reach this point
}
+
public MethodBinding resolveTypesFor(MethodBinding method) {
-
+ ProblemReporter problemReporter = this.scope.problemReporter();
+ IErrorHandlingPolicy suspendedPolicy = problemReporter.suspendTempErrorHandlingPolicy();
+ try {
+ return resolveTypesWithSuspendedTempErrorHandlingPolicy(method);
+ } finally {
+ problemReporter.resumeTempErrorHandlingPolicy(suspendedPolicy);
+ }
+}
+
+private MethodBinding resolveTypesWithSuspendedTempErrorHandlingPolicy(MethodBinding method) {
if (!isPrototype())
return this.prototype.resolveTypesFor(method);