redhat-developer / vscode-java

Java Language Support for Visual Studio Code
Eclipse Public License 2.0
2.07k stars 433 forks source link

Java Language Server fails with classes that extends sealed class. #3636

Closed UnnamedXAer closed 3 months ago

UnnamedXAer commented 5 months ago

I'm not able to use rename, quick fix, go to definition when editing class that extends sealed class.

Environment
Steps To Reproduce
  1. Try to rename argument of method in class that extends sealed class.

[Please attach a sample project reproducing the error] https://github.com/UnnamedXAer/java_language_server_issue_sealed

// .../Storage.java
public abstract sealed class Storage implements AutoCloseable
    permits SqlStorage {
  public abstract Object get(int id) throws Exception;
}
// .../SqlStorage.java
public final class SqlStorage extends Storage {

  @Override
  public void close() throws Exception {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException("Unimplemented method 'close'");
  }

  @Override
  public Object get(int id) throws Exception {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException("Unimplemented method 'get'");
  }

  private String add(String a) {
    return String.format("%s%s", a, a);
  }
}

logs

https://github.com/UnnamedXAer/java_language_server_issue_sealed/blob/master/README.md#full-log

!ENTRY org.eclipse.jdt.ls.core 4 0 2024-04-30 08:54:03.183
!MESSAGE Error computing hover
!STACK 0
java.lang.NullPointerException: Cannot read the array length because "superPermittedTypes" is null
    at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.checkPermitsAndAdd(SourceTypeBinding.java:1346)
    at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.checkPermitsInType(SourceTypeBinding.java:1202)
    at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.faultInTypesForFieldsAndMethods(SourceTypeBinding.java:1116)
    at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:608)
    at org.eclipse.jdt.internal.codeassist.SelectionEngine.select(SelectionEngine.java:1076)
    at org.eclipse.jdt.internal.core.Openable.codeSelect(Openable.java:166)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:382)
    at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:375)
    at org.eclipse.jdt.ls.core.internal.JDTUtils.findElementsAtSelection(JDTUtils.java:1036)
    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:666)
    at org.eclipse.jdt.ls.core.internal.BaseJDTLanguageServer.lambda$0(BaseJDTLanguageServer.java:87)
    at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture$Completion.exec(Unknown Source)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
    at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Current Result

Popup saying 'Internal error'; image

Expected Result

Rename box; image

Additional Informations

In more advanced scenarios (classes) most of the LSP related features do not work.

rgrunber commented 3 months ago

Looks similar to https://github.com/eclipse-jdt/eclipse.jdt.core/issues/1641. Maybe this is another way of triggering the problem that hadn't been predicted upstream.

Was able to easily reproduce by calling code completion in a source file that extends a sealed class.

stacktrace ``` [Error - 10:29:53] Jun. 7, 2024, 10:29:53 a.m. Problem with codeComplete for file:///home/rgrunber/sample-projects/json-example/src/org/example/Decor.java Cannot read the array length because "superPermittedTypes" is null java.lang.NullPointerException: Cannot read the array length because "superPermittedTypes" is null at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.checkPermitsAndAdd(SourceTypeBinding.java:1345) at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.checkPermitsInType(SourceTypeBinding.java:1201) at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.faultInTypesForFieldsAndMethods(SourceTypeBinding.java:1116) at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:608) at org.eclipse.jdt.internal.codeassist.CompletionEngine.complete(CompletionEngine.java:2329) 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.ls.core.internal.handlers.CompletionHandler.computeContentAssist(CompletionHandler.java:287) at org.eclipse.jdt.ls.core.internal.handlers.CompletionHandler.completion(CompletionHandler.java:121) at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.completion(JDTLanguageServer.java:621) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.lambda$recursiveFindRpcMethods$0(GenericEndpoint.java:65) at org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.request(GenericEndpoint.java:120) at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleRequest(RemoteEndpoint.java:272) at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:201) at org.eclipse.jdt.ls.core.internal.ParentProcessWatcher.lambda$1(ParentProcessWatcher.java:144) at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:194) at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:94) at org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:113) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source) ```

Update: This is reproducible in upstream Eclipse as well.

rgrunber commented 3 months ago

This has just been fixed upstream. As soon as a build is available of JDT (from today), I can update this in the language server and have this in our pre-releases (towards 1.32.0 for end of month).