openrewrite / rewrite-kotlin

Work-in-progress implementation of Kotlin language support for OpenRewrite.
Apache License 2.0
40 stars 12 forks source link

Error on destruct with `_` in for loop variable #298

Closed knutwannheden closed 8 months ago

knutwannheden commented 10 months ago

The test

    @Test
    void functionCallCondition() {
        rewriteRun(
          kotlin(
            """
              fun foo(choices: List<Pair<String, String>>, peekedHeader: Regex) {
                  for ((_, adapter) in choices) {
                      if (adapter.matches(peekedHeader)) {
                          print("1")
                      }
                  }
              }
              """
          )
        );
    }

results in the following exception:

java.lang.IllegalArgumentException: Unsupported condition type.
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitWhenBranch(KotlinParserVisitor.kt:3316)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement0(KotlinParserVisitor.kt:4593)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement(KotlinParserVisitor.kt:4524)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitWhenExpression(KotlinParserVisitor.kt:3439)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement0(KotlinParserVisitor.kt:4594)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement(KotlinParserVisitor.kt:4524)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock0(KotlinParserVisitor.kt:834)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock(KotlinParserVisitor.kt:772)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock(KotlinParserVisitor.kt:750)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement0(KotlinParserVisitor.kt:4548)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement(KotlinParserVisitor.kt:4524)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.mapForLoop(KotlinParserVisitor.kt:4796)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock0(KotlinParserVisitor.kt:807)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock(KotlinParserVisitor.kt:772)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitBlock(KotlinParserVisitor.kt:750)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement0(KotlinParserVisitor.kt:4548)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement(KotlinParserVisitor.kt:4524)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.mapFunctionBody(KotlinParserVisitor.kt:526)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitSimpleFunction(KotlinParserVisitor.kt:2691)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement0(KotlinParserVisitor.kt:4578)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitElement(KotlinParserVisitor.kt:4524)
    at org.openrewrite.kotlin.internal.KotlinParserVisitor.visitFile(KotlinParserVisitor.kt:166)
    at org.openrewrite.kotlin.KotlinParser.lambda$parseInputs$3(KotlinParser.java:176)
knutwannheden commented 10 months ago

The problem here is that the _ variable somehow gets optimized away in the FIR. So the best way to fix this is probably to consult the PSI.

traceyyoshima commented 8 months ago

Fixed in PSI parser