netbeans icon indicating copy to clipboard operation
netbeans copied to clipboard

Parsing of java code with broken lambdas fails

Open frankvdh opened this issue 1 year ago • 5 comments

Apache NetBeans version

Apache NetBeans 21

What happened

I received this notification...


Annotation: An error occurred during parsing of 'C:\home\frank\NetBeansProjects\PdfTables\test\frankv\pdftables\test\MultipleTablesTest.java'. Please report a bug against java/source and attach dump file 'C:\Users\frank\AppData\Roaming\NetBeans\21\var\log\MultipleTablesTest_92.dump'.
Annotation: An error occurred during parsing of 'C:\home\frank\NetBeansProjects\PdfTables\test\frankv\pdftables\test\MultipleTablesTest.java'. Please report a bug against java/source and attach dump file 'C:\Users\frank\AppData\Roaming\NetBeans\21\var\log\MultipleTablesTest_92.dump'.
Annotation: An error occurred during parsing of 'C:\home\frank\NetBeansProjects\PdfTables\test\frankv\pdftables\test\MultipleTablesTest.java'. Please report a bug against java/source and attach dump file 'C:\Users\frank\AppData\Roaming\NetBeans\21\var\log\MultipleTablesTest_92.dump'.
An error occurred during parsing of 'C:\home\frank\NetBeansProjects\PdfTables\test\frankv\pdftables\test\MultipleTablesTest.java'. Please report a bug against java/source and attach dump file 'C:\Users\frank\AppData\Roaming\NetBeans\21\var\log\MultipleTablesTest_92.dump'.
An error occurred during parsing of 'C:\home\frank\NetBeansProjects\PdfTables\test\frankv\pdftables\test\MultipleTablesTest.java'. Please report a bug against java/source and attach dump file 'C:\Users\frank\AppData\Roaming\NetBeans\21\var\log\MultipleTablesTest_92.dump'.
Caused: java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.tree.JCTree.accept(com.sun.tools.javac.tree.JCTree$Visitor)" because "tree" is null
	at com.sun.tools.javac.comp.ArgumentAttr.attribArg(ArgumentAttr.java:198)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:660)
	at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:763)
	at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2608)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:715)
	at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:2326)
	at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1603)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:755)
	at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:3223)
	at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1993)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.complete(DeferredAttr.java:316)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.check(DeferredAttr.java:355)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.check(DeferredAttr.java:339)
	at com.sun.tools.javac.comp.Resolve$MethodResultInfo.check(Resolve.java:1073)
	at com.sun.tools.javac.comp.Resolve$4.checkArg(Resolve.java:900)
	at com.sun.tools.javac.comp.Resolve$AbstractMethodCheck.argumentsAcceptable(Resolve.java:788)
	at com.sun.tools.javac.comp.Resolve$4.argumentsAcceptable(Resolve.java:909)
	at com.sun.tools.javac.comp.Infer.instantiateMethod(Infer.java:175)
	at com.sun.tools.javac.comp.Resolve.rawInstantiate(Resolve.java:618)
	at com.sun.tools.javac.comp.Resolve.checkMethod(Resolve.java:657)
	at com.sun.tools.javac.comp.Attr.checkMethod(Attr.java:4949)
	at com.sun.tools.javac.comp.AttrRecover.doRecovery(AttrRecover.java:193)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:738)
	at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:755)
	at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:3197)
	at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1993)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.DeferredAttr.attribSpeculative(DeferredAttr.java:515)
	at com.sun.tools.javac.comp.DeferredAttr.attribSpeculative(DeferredAttr.java:495)
	at com.sun.tools.javac.comp.DeferredAttr.attribSpeculative(DeferredAttr.java:466)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.complete(DeferredAttr.java:311)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.check(DeferredAttr.java:355)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredType.check(DeferredAttr.java:339)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.recover(DeferredAttr.java:1094)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.typeOf(DeferredAttr.java:1060)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.typeOf(DeferredAttr.java:1050)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredTypeMap.visitType(DeferredAttr.java:1027)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.visitType(DeferredAttr.java:1050)
	at com.sun.tools.javac.comp.DeferredAttr$DeferredTypeMap.visitType(DeferredAttr.java:1013)
	at com.sun.tools.javac.code.Type.accept(Type.java:223)
	at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4894)
	at com.sun.tools.javac.code.Types$TypeMapping.lambda$visit$0(Types.java:5002)
	at com.sun.tools.javac.util.List.map(List.java:428)
	at com.sun.tools.javac.code.Types$TypeMapping.visit(Types.java:5002)
	at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:290)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.visitMethodType(DeferredAttr.java:1078)
	at com.sun.tools.javac.comp.DeferredAttr$RecoveryDeferredTypeMap.visitMethodType(DeferredAttr.java:1050)
	at com.sun.tools.javac.code.Type$MethodType.accept(Type.java:1495)
	at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4894)
	at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitForAll(Type.java:306)
	at com.sun.tools.javac.code.Type$StructuralTypeMapping.visitForAll(Type.java:239)
	at com.sun.tools.javac.code.Type$ForAll.accept(Type.java:1854)
	at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4894)
	at com.sun.tools.javac.code.Type.map(Type.java:319)
	at com.sun.tools.javac.comp.AttrRecover.basicMethodInvocationRecovery(AttrRecover.java:223)
	at com.sun.tools.javac.comp.AttrRecover.recoverMethodInvocation(AttrRecover.java:214)
	at com.sun.tools.javac.comp.Attr.checkMethodIdInternal(Attr.java:4644)
	at com.sun.tools.javac.comp.Attr.checkId(Attr.java:4634)
	at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:4527)
	at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2581)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2617)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:715)
	at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:2326)
	at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1603)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:755)
	at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1439)
	at org.netbeans.lib.nbjavac.services.NBAttr.visitBlock(NBAttr.java:90)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.visitTry(Attr.java:1963)
	at com.sun.tools.javac.tree.JCTree$JCTry.accept(JCTree.java:1465)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:755)
	at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1439)
	at org.netbeans.lib.nbjavac.services.NBAttr.visitBlock(NBAttr.java:90)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1229)
	at org.netbeans.lib.nbjavac.services.NBAttr.visitMethodDef(NBAttr.java:84)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:916)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:662)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:736)
	at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:5655)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5543)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5367)
	at org.netbeans.lib.nbjavac.services.NBAttr.attribClass(NBAttr.java:72)
	at com.sun.tools.javac.comp.Attr.attrib(Attr.java:5306)
	at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1359)
	at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1332)
	at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:404)
	at com.sun.tools.javac.api.JavacTaskImpl.lambda$analyze$1(JavacTaskImpl.java:379)
	at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
	at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:379)
Caused: java.lang.IllegalStateException
	at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:383)
	at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:765)
	at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:536)
	at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:140)
	at org.netbeans.modules.parsing.impl.TaskProcessor.callGetResult(TaskProcessor.java:608)
	at org.netbeans.modules.parsing.impl.SourceCache.getResult(SourceCache.java:241)
	at org.netbeans.modules.parsing.impl.TaskProcessor$RequestPerformer.run(TaskProcessor.java:775)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:288)
	at org.netbeans.modules.parsing.impl.TaskProcessor$RequestPerformer.execute(TaskProcessor.java:702)
[catch] at org.netbeans.modules.parsing.impl.TaskProcessor$CompilationJob.run(TaskProcessor.java:663)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1420)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2035)

MultipleTablesTest_92.zip

Language / Project Type / NetBeans Component

No response

How to reproduce

Occurs when I try to build or rebuild my project. Reloading Netbeans doesn't help.

Did this work correctly in an earlier version?

No / Don't know

Operating System

Win11

JDK

jdk21

Apache NetBeans packaging

Apache NetBeans provided installer

Anything else

No response

Are you willing to submit a pull request?

No

frankvdh avatar May 23 '24 04:05 frankvdh

lets use a more reasonable issue title

mbien avatar May 23 '24 05:05 mbien

This is reproducible standalone with the supplied file. I took that as base and distilled it down to:

import java.util.ArrayList;

public class Dummy { 

    private void main() {
        ArrayList<ArrayList<String[]>> result = new ArrayList<>();
        result.stream().map((table) -> {
            table.stream().map((row) -> {
                return null;
            }).forEachOrdered((_item) -> System.out.println();
        }).forEachOrdered((_item) -> System.out.println("---"))
        );
    }
}

The compiler rightfully complains about this:

Dummy.java:10: error: ')' or ',' expected
            }).forEachOrdered((_item) -> System.out.println();
                                                             ^
Dummy.java:11: error: ';' expected
        }).forEachOrdered((_item) -> System.out.println("---"))
                                                               ^
2 errors

But NB raises an Exception as already shown.

I used by debugging-fu and found, that the JCMethodInvocation instance that for the lambda is indeed constructed with an argument list and all arguments are non-null. So I figured, that some later stage must destroy the tree for the argument and indeed I got a hit in com.sun.tools.javac.tree.TreeTranslator.translate(List<T>)/com.sun.tools.javac.tree.TreeTranslator.visitApply(JCMethodInvocation). The transformation that is applied there is an anonymous class in com.sun.tools.javac.comp.AttrRecover.AttrRecover(Context).

This comment:

https://github.com/openjdk/jdk/blob/617edf3f0dea2b73e4b444e085de2ad282826e31/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrRecover.java#L151-L154

makes no sense from my POV as the TreeTranslator expects the translated tree in result. If the translation result must not be null, the caller could be modified to check for null and only replace the tree if the translation is non-null (line 59 and following):

https://github.com/openjdk/jdk/blob/617edf3f0dea2b73e4b444e085de2ad282826e31/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeTranslator.java#L54-L63

Or the AttrRecover class needs to be adjusted to return set result to the input tree if it shall not be touched.

@lahodaj would you mind having a look at this? I try to reason my way around this, but maybe this the right analysis and you can whip up the right fix?!

matthiasblaesing avatar May 27 '24 19:05 matthiasblaesing

@matthiasblaesing, uh. You are right, of course. Thanks for diagnosing it so deeply. I've filled: https://bugs.openjdk.org/browse/JDK-8333107

lahodaj avatar May 28 '24 18:05 lahodaj

@lahodaj thank you! As the fix made it already into 23, I assume next nb-javac update should fix this issue.

matthiasblaesing avatar Jun 02 '24 20:06 matthiasblaesing

should be fixed via https://github.com/apache/netbeans/pull/7484

mbien avatar Jun 14 '24 16:06 mbien