apache / netbeans

Apache NetBeans
https://netbeans.apache.org/
Apache License 2.0
2.6k stars 836 forks source link

Parsing of java code with broken lambdas fails #7397

Closed frankvdh closed 1 week ago

frankvdh commented 1 month ago

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

mbien commented 1 month ago

lets use a more reasonable issue title

matthiasblaesing commented 1 month ago

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?!

lahodaj commented 1 month ago

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

matthiasblaesing commented 1 month ago

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

mbien commented 1 month ago

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