Method lookup error causes NullPointerException with nested lambdas
Issue #202
new
ExtendJ 8.0.1-174-g53debda Java SE 8
The following test case should generate an error message instead of a NullPointerException:
import java.util.function.Function;
interface StringTransformer {
String transform(String str, Function<String, String> fun);
String replaceWords(String str, Function<String, String> fun);
}
public class Lambda2 {
public String replace(String input, StringTransformer transformer) {
return transform(input, str -> replaceWords(str, word -> "foo"));
}
}
The transform
method access is incorrect - it should be qualified by transformer
. However, this test case should result in a nice error message instead of the following:
Fatal exception:
java.lang.NullPointerException
at org.extendj.ast.LambdaExpr.toClass(LambdaExpr.java:334)
at org.extendj.ast.LambdaExpr.anonymousDecl(LambdaExpr.java:350)
at org.extendj.ast.LambdaExpr.Define_enclosingLambdaType(LambdaExpr.java:1507)
at org.extendj.ast.ASTNode.Define_enclosingLambdaType(ASTNode.java:4113)
at org.extendj.ast.InferredParameterDeclaration.enclosingLambdaType(InferredParameterDeclaration.java:800)
at org.extendj.ast.InferredParameterDeclaration.hostType(InferredParameterDeclaration.java:608)
at org.extendj.ast.VarAccess.nameProblems(VarAccess.java:807)
at org.extendj.ast.VarAccess.contributeTo_CompilationUnit_problems(VarAccess.java:1280)
at org.extendj.ast.CompilationUnit.problems_compute(CompilationUnit.java:1662)
at org.extendj.ast.CompilationUnit.problems(CompilationUnit.java:1641)
at org.extendj.ast.CompilationUnit.errors(CompilationUnit.java:696)
at org.extendj.ast.Frontend.processCompilationUnit(Frontend.java:217)
at org.extendj.JavaCompiler.processCompilationUnit(JavaCompiler.java:107)
at org.extendj.ast.Frontend.run(Frontend.java:142)
at org.extendj.JavaCompiler.run(JavaCompiler.java:101)
at org.extendj.JavaCompiler.main(JavaCompiler.java:61)
at org.jastadd.extendj.JavaCompiler.main(JavaCompiler.java:39)
Comments (2)
-
reporter -
reporter The problem is caused by
LambdaExpr.targetInterface()
being nullable, but used without a null guard in creating an anonymous class for lambda expressions. See java8/frontend/LambdaAnonymousDecl.jrag:syn nta ClassInstanceExpr LambdaExpr.toClass() = new ClassInstanceExpr( targetInterface().createQualifiedAccess(), new List<Expr>(), new Opt<TypeDecl>(buildAnonymousDecl()));
- Log in to comment
The original test case is:
jsr335/lambda/err_01f
.Added another test (
jsr335/lambda/err_02f
), which does not use type inference: