eclipse-jdtls / eclipse-jdt-core-incubator

Eclipse Public License 2.0
8 stars 1 forks source link

unconditional patterns in instanceof are not supported in -source 17 #681

Open testforstephen opened 1 month ago

testforstephen commented 1 month ago

I'm trying to use javac bits to open eclipse.jdt.ls project itself, and it throws some error unconditional patterns in instanceof are not supported in -source 17.

image

Call stack:

!ENTRY org.eclipse.jdt.core 4 0 2024-08-12 12:46:05.220
!MESSAGE Internal failure while parsing or converting AST for unit /org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDeclarationHandler.java

!ENTRY org.eclipse.jdt.core 4 0 2024-08-12 12:46:05.222
!MESSAGE Operation only supported in JLS21 AST
!STACK 0
java.lang.UnsupportedOperationException: Operation only supported in JLS21 AST
    at org.eclipse.jdt.core.dom.ASTNode.supportedOnlyIn21(ASTNode.java:2587)
    at org.eclipse.jdt.core.dom.Pattern.<init>(Pattern.java:42)
    at org.eclipse.jdt.core.dom.TypePattern.<init>(TypePattern.java:81)
    at org.eclipse.jdt.core.dom.AST.newTypePattern(AST.java:3340)
    at org.eclipse.jdt.core.dom.JavacConverter.convert(JavacConverter.java:1773)
    at org.eclipse.jdt.core.dom.JavacConverter.convertExpressionImpl(JavacConverter.java:1404)
    at org.eclipse.jdt.core.dom.JavacConverter.convertExpression(JavacConverter.java:1749)
    at org.eclipse.jdt.core.dom.JavacConverter.handleInfixExpression(JavacConverter.java:1665)
    at org.eclipse.jdt.core.dom.JavacConverter.convertExpressionImpl(JavacConverter.java:1321)
    at org.eclipse.jdt.core.dom.JavacConverter.convertExpression(JavacConverter.java:1749)
    at org.eclipse.jdt.core.dom.JavacConverter.convertIfStatement(JavacConverter.java:2612)
    at org.eclipse.jdt.core.dom.JavacConverter.convertStatement(JavacConverter.java:2175)
    at org.eclipse.jdt.core.dom.JavacConverter.convertBlock(JavacConverter.java:2484)
    at org.eclipse.jdt.core.dom.JavacConverter.convertTryStatement(JavacConverter.java:2496)
    at org.eclipse.jdt.core.dom.JavacConverter.convertStatement(JavacConverter.java:2184)
    at org.eclipse.jdt.core.dom.JavacConverter.convertBlock(JavacConverter.java:2484)
    at org.eclipse.jdt.core.dom.JavacConverter.convertMethodDecl(JavacConverter.java:894)
    at org.eclipse.jdt.core.dom.JavacConverter.convertBodyDeclaration(JavacConverter.java:696)
    at org.eclipse.jdt.core.dom.JavacConverter.convertClassDecl(JavacConverter.java:557)
    at org.eclipse.jdt.core.dom.JavacConverter.convertClassDecl(JavacConverter.java:486)
    at org.eclipse.jdt.core.dom.JavacConverter.convertBodyDeclaration(JavacConverter.java:699)
    at org.eclipse.jdt.core.dom.JavacConverter.lambda$populateCompilationUnit$2(JavacConverter.java:179)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636)
    at org.eclipse.jdt.core.dom.JavacConverter.populateCompilationUnit(JavacConverter.java:181)
    at org.eclipse.jdt.core.dom.JavacCompilationUnitResolver.parse(JavacCompilationUnitResolver.java:620)
    at org.eclipse.jdt.core.dom.JavacCompilationUnitResolver.toCompilationUnit(JavacCompilationUnitResolver.java:458)
    at org.eclipse.jdt.core.dom.ASTParser.internalCreateASTCached(ASTParser.java:1263)
    at org.eclipse.jdt.core.dom.ASTParser.lambda$0(ASTParser.java:1142)
    at org.eclipse.jdt.internal.core.JavaModelManager.cacheZipFiles(JavaModelManager.java:5762)
    at org.eclipse.jdt.core.dom.ASTParser.internalCreateAST(ASTParser.java:1142)
    at org.eclipse.jdt.core.dom.ASTParser.createAST(ASTParser.java:882)
    at org.eclipse.jdt.internal.core.CompilationUnit.getOrBuildAST(CompilationUnit.java:552)
    at org.eclipse.jdt.internal.codeassist.DOMCodeSelector.codeSelect(DOMCodeSelector.java:107)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:526)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:518)
    at org.eclipse.jdt.ls.core.internal.JDTUtils.findElementsAtSelection(JDTUtils.java:1062)
    at org.eclipse.jdt.ls.core.internal.HoverInfoProvider.computeHover(HoverInfoProvider.java:101)
    at org.eclipse.jdt.ls.core.internal.handlers.HoverHandler.computeHover(HoverHandler.java:57)
    at org.eclipse.jdt.ls.core.internal.handlers.HoverHandler.hover(HoverHandler.java:43)
    at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.lambda$5(JDTLanguageServer.java:656)
    at org.eclipse.jdt.ls.core.internal.BaseJDTLanguageServer.lambda$0(BaseJDTLanguageServer.java:87)
    at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:690)
    at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:527)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1458)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2034)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:189)
testforstephen commented 1 month ago

I believe there's a discrepancy between our implementation and the upstream JDT core regarding how the AST level is set for the DOM parser.

In the upstream JDT core, when using the DOM ASTParser, the AST level is always set to IASTSharedValues.SHARED_AST_LEVEL, which corresponds to the latest Java version supported by JDT. This can be observed in typical usages of the DOM parser, such as in org.eclipse.jdt.core.manipulation.CoreASTProvider. However, in our implementation with javac, the AST level is determined based on the project's options (see org.eclipse.jdt.internal.core.CompilationUnit.getOrBuildAST). As a result, this approach causes issues when working with Java 17 projects, where the DOM parser does not function correctly.

testforstephen commented 1 month ago

This issue can easily be reproduced when using Javac bits to work with Java 17 instanceof syntax.

robstryker commented 4 weeks ago

https://github.com/eclipse-jdtls/eclipse-jdt-core-incubator/pull/688/commits/de6db931f2fe847d5c6088d30951f7215d1ffbfd

This commit may fix this issue. We'll see.

fbricon commented 1 week ago

@robstryker was that commit ever merged? This issue is still present with the latest builds