redhat-developer / vscode-java

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

Change Method Signature fails to modify parameter type #3535

Open phraktle opened 7 months ago

phraktle commented 7 months ago

Change Method Signature fails when trying to modify a parameter type.

Environment
Steps To Reproduce
  1. Use "Change method signature" to change the type of an input parameter
  2. Hit Preview or Refactor
Current Result

The buttons do not seem to do anything. In the output panel, the following exception is shown:

SEVERE: Internal error: java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.ast.TypeReference.getTypeName()" because "argument.type" is null
java.util.concurrent.CompletionException: java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.ast.TypeReference.getTypeName()" because "argument.type" is null
    at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
    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)
Caused by: java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.ast.TypeReference.getTypeName()" because "argument.type" is null
    at org.eclipse.jdt.internal.compiler.parser.RecoveredMethod.updateFromParserState(RecoveredMethod.java:496)
    at org.eclipse.jdt.internal.compiler.parser.Parser.updateRecoveryState(Parser.java:14202)
    at org.eclipse.jdt.internal.compiler.parser.Parser.resumeOnSyntaxError(Parser.java:14112)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12626)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12978)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12935)
    at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:11317)
    at org.eclipse.jdt.internal.core.search.matching.MatchLocator.parseAndBuildBindings(MatchLocator.java:1950)
    at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1305)
    at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1406)
    at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1526)
    at org.eclipse.jdt.internal.core.search.JavaSearchParticipant.locateMatches(JavaSearchParticipant.java:134)
    at org.eclipse.jdt.internal.core.search.BasicSearchEngine.findMatches(BasicSearchEngine.java:253)
    at org.eclipse.jdt.internal.core.search.BasicSearchEngine.search(BasicSearchEngine.java:599)
    at org.eclipse.jdt.core.search.SearchEngine.search(SearchEngine.java:669)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.findAllDeclarations(RippleMethodFinder2.java:475)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.findAllRippleMethods(RippleMethodFinder2.java:208)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.getAllRippleMethods(RippleMethodFinder2.java:188)
    at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.getRelatedMethods(RippleMethodFinder2.java:181)
    at org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor.checkFinalConditions(ChangeSignatureProcessor.java:823)
    at org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring.checkFinalConditions(ProcessorBasedRefactoring.java:227)
    at org.eclipse.jdt.ls.core.internal.handlers.ChangeSignatureHandler.getChangeSignatureRefactoring(ChangeSignatureHandler.java:198)
    at org.eclipse.jdt.ls.core.internal.handlers.GetRefactorEditHandler.getEditsForRefactor(GetRefactorEditHandler.java:161)
    at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.lambda$46(JDTLanguageServer.java:1128)
    at org.eclipse.jdt.ls.core.internal.BaseJDTLanguageServer.lambda$0(BaseJDTLanguageServer.java:87)
    ... 7 more
Expected Result

Should just work. Or at least give visual feedback an about the error (fails silently).

Additional Informations
snjeza commented 7 months ago

@phraktle I can't reproduce the issue. Could you provide a project example?

phraktle commented 7 months ago

It's definitely showing up in a larger code base that I'm not at liberty to share. I don't have an isolated test case. The method signature is like:

public interface Foo {

  double get(Bar bar, Baz baz);

}

the interface has a bunch of concrete classes implementing it and i'm trying to change Baz to Qux.