Skip to content

RemoveUnusedLocalVariables crashes when unused variable is within some method invocation #786

@greg-at-moderne

Description

@greg-at-moderne

What version of OpenRewrite are you using?

Current main:

  • OR = e1f2efd3f4365c93d7dd93212bc66892b90219b5
  • rewrite-static-analysis = af53ce1

What is the smallest, simplest way to reproduce the problem?

The following unit test when added to RemoveUnusedLocalVariablesTest:

    @Test
    void withinMethodInvocation() {
        rewriteRun(
            java(
              """
              import java.util.List;

              class C {
                  void m(List<String> arguments) {
                      arguments.stream().map(s -> {
                          String version;
                          String someValue = "436 Natolin";
                          if ("version".equals(s)) {
                              version = someValue;
                          }
                          return "195 Huta";
                      });
                  }
              }
              """
            )
        );
    }

crashes with:

Caused by: java.lang.ClassCastException: class org.openrewrite.java.tree.J$Identifier cannot be cast to class org.openrewrite.java.tree.Statement (org.openrewrite.java.tree.J$Identifier and org.openrewrite.java.tree.Statement are in unnamed module of loader 'app')
	at org.openrewrite.java.JavaPrinter.visitStatement(JavaPrinter.java:406)
	at org.openrewrite.java.JavaPrinter.visitStatements(JavaPrinter.java:394)

A similar crash has been observed in real-life:

java.lang.ClassCastException: class org.openrewrite.java.tree.J$Identifier cannot be cast to class org.openrewrite.java.tree.Statement (org.openrewrite.java.tree.J$Identifier and org.openrewrite.java.tree.Statement are in unnamed module of loader 'app')
  org.openrewrite.internal.ListUtils.map(ListUtils.java:245)
  org.openrewrite.internal.ListUtils.map(ListUtils.java:269)
  org.openrewrite.java.DeleteStatement.visitBlock(DeleteStatement.java:128)
  org.openrewrite.java.DeleteStatement.visitBlock(DeleteStatement.java:51)

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions