eclipse-jdt / eclipse.jdt.core

Eclipse Public License 2.0
161 stars 130 forks source link

NullPointer in code completion inside a Lambda. #3127

Open jcompagner opened 4 days ago

jcompagner commented 4 days ago

i am using Build id: I20240903-0240

and i get this exception:

!STACK 0
java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.lookup.TypeBinding.kind()" because "receiverType" is null
    at org.eclipse.jdt.internal.compiler.lookup.Scope.getMethod(Scope.java:3135)
    at org.eclipse.jdt.internal.compiler.ast.MessageSend.findMethodBinding(MessageSend.java:1174)
    at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:904)
    at org.eclipse.jdt.internal.compiler.ast.Expression.resolve(Expression.java:1126)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:311)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.ForeachStatement.resolve(ForeachStatement.java:683)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:128)
    at org.eclipse.jdt.internal.compiler.ast.Statement.resolveWithBindings(Statement.java:498)
    at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveStatements(ASTNode.java:725)
    at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:713)
    at org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration.resolveStatements(ConstructorDeclaration.java:685)
    at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:611)
    at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1514)
    at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1643)
    at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:666)
    at org.eclipse.jdt.internal.codeassist.CompletionEngine.complete(CompletionEngine.java:2335)
    at org.eclipse.jdt.internal.core.Openable.codeComplete(Openable.java:135)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeComplete(CompilationUnit.java:360)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeComplete(CompilationUnit.java:350)
    at org.eclipse.jdt.internal.ui.text.java.ChainCompletionProposalComputer.initializeRequiredContext(ChainCompletionProposalComputer.java:94)
    at org.eclipse.jdt.internal.ui.text.java.ChainCompletionProposalComputer.computeCompletionProposals(ChainCompletionProposalComputer.java:71)
    at org.eclipse.jdt.internal.ui.text.java.CompletionProposalComputerDescriptor.computeCompletionProposals(CompletionProposalComputerDescriptor.java:354)
    at org.eclipse.jdt.internal.ui.text.java.CompletionProposalCategory.computeCompletionProposals(CompletionProposalCategory.java:340)
    at org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.collectProposals(ContentAssistProcessor.java:332)
    at org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.computeCompletionProposals(ContentAssistProcessor.java:288)
    at org.eclipse.jface.text.contentassist.AsyncCompletionProposalPopup.lambda$10(AsyncCompletionProposalPopup.java:378)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
    at org.eclipse.jface.text.contentassist.AsyncCompletionProposalPopup.lambda$9(AsyncCompletionProposalPopup.java:377)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)

when i am trying to code complete inside a lambda

this is part of my code: i added 2 comment lines where code completion works and where it fails

            if (docFile.exists())
            {
                try
                {
                    String docContents = FileUtils.readFileToString(docFile, Charset.forName("UTF8"));
                    CompilerEnvirons env = new CompilerEnvirons();
                    env.setRecordingComments(true);
                    env.setRecordingLocalJsDocComments(true);
                    org.mozilla.javascript.Parser parser = new org.mozilla.javascript.Parser(env);
                    AstRoot parse = parser.parse(docContents, "", 0);
                    SortedSet<Comment> comments = parse.getComments();
                    Comment prevComment = null;
                    if (comments != null) for (Comment comment : comments)
                    {
                        if (comment.getNext() instanceof FunctionNode fn)
                        {
                            String name = fn.getFunctionName().toSource();
                            apiDoc.put(name, processFunctionJSDoc(comment.toSource()));
                            if (fn.getBody().hasChildren())
                            {
                                // here code completion works
                                fn.getBody().forEach(node -> {
                                    if (node instanceof ExpressionStatement es)
                                    {
                                        // here code completion fails
                                    }
                                });
                            }
                        }
                        else if (prevComment == null)
                        {
                            // it's the top-most comment that gives a short description of the purpose of the whole component/service
                            apiDoc.put(WEB_OBJECT_OVERVIEW_KEY, processFunctionJSDoc(comment.toSource()));
                        }
                        prevComment = comment;
                    }

                }
                catch (IOException e)
                {
                    throw new RuntimeException("Cannot parse docfile: " + docFileName, e);
                }
            }
            else
            {
                System.err.println("    * docfile: " + docFileName + " doesn't exist in the parent structure of the spec file " + specFile + " !");
            }
srikanth-sankaran commented 3 days ago

We are a bit resource constrained unfortunately. Defect reports that have readily reproducible cases will likely receiver swifter response relatively speaking.