rewrite-static-analysis icon indicating copy to clipboard operation
rewrite-static-analysis copied to clipboard

Add recipe to remove unused constructor and method parameters

Open iddeepak opened this issue 8 months ago • 14 comments

What’s changed?

I’ve added a new recipe class, RemoveUnusedParams, that automatically removes parameters from Java methods when they’re declared but never referenced in the method body. It still respects:

  • @Override methods (both explicit and those detected across the codebase)
  • Native methods
  • Parameters with their own annotations (e.g. @Deprecated)
  • Constructors, varargs, interfaces, and other edge cases

Alongside the main recipe, I’ve expanded the unit tests to cover:

  • Basic removal of unused parameters
  • Preservation of used, overridden, and annotated parameters
  • Constructors with unused arguments
  • Varargs methods
  • Native declarations
  • Interface methods (no change expected)

What’s your motivation?

Over time, code tends to accumulate unused parameters—leftovers from refactoring, changing requirements, or evolving APIs. They add noise, make signatures harder to read, and can confuse future maintainers. This recipe:

  1. Keeps signatures lean, showing exactly what each method actually needs
  2. Automates cleanup, reducing manual PR churn
  3. Helps enforce consistency across a large codebase

Anything in particular you'd like reviewers to focus on?

  • Override detection: Does the scan/visitor logic reliably catch all overridden methods?
  • Edge-case coverage: Any real-world patterns (e.g. multi-parameter annotations, complex varargs, inner-class overrides) that might slip through?
  • Performance: The recipe now uses a single JavaIsoVisitor pass—does it still scale on large projects?

Anyone you would like to review specifically?

  • @Pankraz76

Have you considered any alternatives or workarounds?

  • Keeping the original “shadow-stack” approach to detect name shadowing more precisely—but in practice it added complexity without significant benefit.
  • Using a dedicated MethodMatcher or type-based override detection; this felt like overkill for a simple annotation check.

Any additional context

  • This work is driven by feedback on Issue #559.
  • All existing tests pass, and I’ve verified the new cases locally with mvn test.
  • I’ve also run the IntelliJ auto-formatter to keep the style consistent.

Checklist

  • [x] I’ve added unit tests to cover both positive and negative cases
  • [x] I’ve read and applied the recipe conventions and best practices
  • [x] I’ve used the IntelliJ IDEA auto-formatter on affected files

iddeepak avatar May 16 '25 04:05 iddeepak

This one done:

  • https://pmd.github.io/pmd/pmd_rules_java_bestpractices.html#unusedformalparameter

Do we cover generic assignment as well? Might be dedicated recipe, to give options.

  • https://pmd.github.io/pmd/pmd_rules_java_bestpractices.html#unusedassignment

Pankraz76 avatar May 16 '25 07:05 Pankraz76

This one done:

  • https://pmd.github.io/pmd/pmd_rules_java_bestpractices.html#unusedformalparameter

Do we cover generic assignment as well? Might be dedicated recipe, to give options.

  • https://pmd.github.io/pmd/pmd_rules_java_bestpractices.html#unusedassignment

RemoveUnusedParams only handles unused parameters. Unused assignments would need their own recipe

iddeepak avatar May 16 '25 15:05 iddeepak

this could be follow up:

  • https://pmd.github.io/pmd/pmd_rules_java_bestpractices.html#unusedassignment
  • https://github.com/apache/maven/pull/2350

Pankraz76 avatar May 19 '25 06:05 Pankraz76

this could be follow up:

@Pankraz76 Thanks! I’ve opened Issue #564 to track adding the UnusedAssignment recipe. Please feel free to drop any additional examples or feedback over there!

iddeepak avatar May 19 '25 15:05 iddeepak

Thanks both! I'm not likely to get to a review this week with travel ahead, but perhaps @MBoegers can have a look while I'm out.

timtebeek avatar May 19 '25 17:05 timtebeek

items:

ReplaceStackWithDequeTest > replaceStack() FAILED
    org.opentest4j.AssertionFailedError: [Unexpected result in "Test.java":
    diff --git a/Test.java b/Test.java
    index 40b7137..a72df50 100644
    --- a/Test.java
    +++ b/Test.java
    @@ -4,7 +4,7 @@ 
 
     class Test {
         void test() {
    -        Deque<Integer> stack = new ArrayDeque<>();
    +        Deque<Integer> arrayDeque = new ArrayDeque<>();
             stack.add(1);
             stack.add(2);
         }
    ] 
    expected: 
      "import java.util.ArrayDeque;
      import java.util.Deque;
      import java.util.Stack;
  
      class Test {
          void test() {
              Deque<Integer> stack = new ArrayDeque<>();
              stack.add(1);
              stack.add(2);
          }
      }"
     but was: 
      "import java.util.ArrayDeque;
      import java.util.Deque;
      import java.util.Stack;
  
      class Test {
          void test() {
              Deque<Integer> arrayDeque = new ArrayDeque<>();
              stack.add(1);
              stack.add(2);
          }
      }"
        at app//org.openrewrite.test.RewriteTest.assertContentEquals(RewriteTest.java:622)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:511)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:130)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:125)
        at app//org.openrewrite.staticanalysis.ReplaceStackWithDequeTest.replaceStack(ReplaceStackWithDequeTest.java:36)

UnnecessaryExplicitTypeArgumentsTest > doesNotRemoveNecessaryTypeArguments() SKIPPED

UnnecessaryExplicitTypeArgumentsTest > withinLambda() SKIPPED

UnnecessaryExplicitTypeArgumentsTest STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JVM IR backend
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

UnnecessaryExplicitTypeArgumentsTest > kotlinTest > changeIfHasTypeInference() SKIPPED

NeedBracesTest > addBracesForIfBranch() SKIPPED

NeedBracesTest STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

StringLiteralEqualityTest > doNotChangeForKotlin() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

UnnecessaryThrowsTest > necessaryThrowsFromConstructorWithUnused() SKIPPED

Gradle Test Executor 5 finished executing tests.

> Task :test

UseCollectionInterfacesTest > explicitImplementationClassInApi() SKIPPED

RenameLocalVariablesToCamelCaseTest > renameBothVariableAndUsage() SKIPPED

RenameLocalVariablesToCamelCaseTest > doNotChangeIfHasInternalModifier() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

ReplaceLambdaWithMethodReferenceTest > toUnqualifiedMethodReference() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

Gradle Test Executor 2 finished executing tests.
Gradle Test Executor 3 finished executing tests.

1513 tests completed, 1 failed, 31 skipped

> Task :test FAILED

Pankraz76 avatar Jun 06 '25 09:06 Pankraz76

items:

ReplaceStackWithDequeTest > replaceStack() FAILED
    org.opentest4j.AssertionFailedError: [Unexpected result in "Test.java":
    diff --git a/Test.java b/Test.java
    index 40b7137..a72df50 100644
    --- a/Test.java
    +++ b/Test.java
    @@ -4,7 +4,7 @@ 
 
     class Test {
         void test() {
    -        Deque<Integer> stack = new ArrayDeque<>();
    +        Deque<Integer> arrayDeque = new ArrayDeque<>();
             stack.add(1);
             stack.add(2);
         }
    ] 
    expected: 
      "import java.util.ArrayDeque;
      import java.util.Deque;
      import java.util.Stack;
  
      class Test {
          void test() {
              Deque<Integer> stack = new ArrayDeque<>();
              stack.add(1);
              stack.add(2);
          }
      }"
     but was: 
      "import java.util.ArrayDeque;
      import java.util.Deque;
      import java.util.Stack;
  
      class Test {
          void test() {
              Deque<Integer> arrayDeque = new ArrayDeque<>();
              stack.add(1);
              stack.add(2);
          }
      }"
        at app//org.openrewrite.test.RewriteTest.assertContentEquals(RewriteTest.java:622)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:511)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:130)
        at app//org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:125)
        at app//org.openrewrite.staticanalysis.ReplaceStackWithDequeTest.replaceStack(ReplaceStackWithDequeTest.java:36)

UnnecessaryExplicitTypeArgumentsTest > doesNotRemoveNecessaryTypeArguments() SKIPPED

UnnecessaryExplicitTypeArgumentsTest > withinLambda() SKIPPED

UnnecessaryExplicitTypeArgumentsTest STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JVM IR backend
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

UnnecessaryExplicitTypeArgumentsTest > kotlinTest > changeIfHasTypeInference() SKIPPED

NeedBracesTest > addBracesForIfBranch() SKIPPED

NeedBracesTest STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

StringLiteralEqualityTest > doNotChangeForKotlin() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

UnnecessaryThrowsTest > necessaryThrowsFromConstructorWithUnused() SKIPPED

Gradle Test Executor 5 finished executing tests.

> Task :test

UseCollectionInterfacesTest > explicitImplementationClassInApi() SKIPPED

RenameLocalVariablesToCamelCaseTest > renameBothVariableAndUsage() SKIPPED

RenameLocalVariablesToCamelCaseTest > doNotChangeIfHasInternalModifier() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

ReplaceLambdaWithMethodReferenceTest > toUnqualifiedMethodReference() STANDARD_ERROR
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64
    logging: using JVM IR backend
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]
    logging: loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le]

Gradle Test Executor 2 finished executing tests.
Gradle Test Executor 3 finished executing tests.

1513 tests completed, 1 failed, 31 skipped

> Task :test FAILED

This test is passed successfully on my local. I even tried ./gradle test on my local and all tests are passed. Do you know why it's failing ? @Pankraz76

iddeepak avatar Jun 06 '25 16:06 iddeepak

no.

seems strange as hard error, not some circle count timeout which can happen as edge case.

would try to update git, integrate with main.

if remains, kill working dir, make new checkout with backup copy, of current project dir.

if remains then its some magic @timtebeek need to handle.

thanks

Pankraz76 avatar Jun 06 '25 17:06 Pankraz76

well done, lets merge.

Pankraz76 avatar Jun 07 '25 08:06 Pankraz76

Thanks both! Marked as ready for review for the wider team to have a look, as I'll be out for most of next week.

timtebeek avatar Jun 07 '25 15:06 timtebeek

Thanks already! Couple fixes applied just now, and a few more hints added where more work is needed. Let me know if you'd like to continue this yourself.

Thank you for the updates and guidance! I’m tied up with some other work as well, but I’ll tackle the remaining items as soon as I have some free time. Please feel free to continue in the meantime.

iddeepak avatar Jun 16 '25 21:06 iddeepak

Hey @timtebeek, thanks for flagging those edge cases—avoidDirectConflict, avoidInheritedConflict, and cascadeRemoveUnusedArguments. I’ll revisit the pruning logic with those in mind. In the meantime, if you have any suggestions on how to handle them, Let me know your thoughts! @Pankraz76

iddeepak avatar Jun 17 '25 21:06 iddeepak

you are really talented, keep pushing @iddeepak.

Pankraz76 avatar Jun 18 '25 09:06 Pankraz76

This PR is stale because it has been open for 90 days with no activity. Remove stale label or comment or this will be closed in two weeks. PRs may be reopened when there is renewed interest.

github-actions[bot] avatar Nov 03 '25 04:11 github-actions[bot]