openrewrite / rewrite-kotlin

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

`IndexOutOfBoundsException` in `KotlinTypeMapping.methodInvocationType()` #590

Closed knutwannheden closed 5 months ago

knutwannheden commented 5 months ago

Currently, the following test

    @Test
    void callWithDefaultedGenericParameters() {
        rewriteRun(
          kotlin(
            """
              internal data class Foo<T : Any>(val i: T, val j: T) {
                  fun f() {
                      return copy(i = 42)
                  }
              }
              """
          )
        );
    }

provokes the following exception:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
  java.base/java.util.Collections$SingletonList.get(Collections.java:4961)
  org.openrewrite.kotlin.KotlinTypeMapping.methodInvocationType(KotlinTypeMapping.kt:799)
  org.openrewrite.kotlin.KotlinTypeMapping.methodInvocationType(KotlinTypeMapping.kt:677)
  org.openrewrite.kotlin.internal.PsiElementAssociations.methodInvocationType(PsiElementAssociations.kt:233)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.methodInvocationType(KotlinTreeParserVisitor.java:3635)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitCallExpression(KotlinTreeParserVisitor.java:2048)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitCallExpression(KotlinTreeParserVisitor.java:74)
  org.jetbrains.kotlin.psi.KtCallExpression.accept(KtCallExpression.java:35)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitReturnExpression(KotlinTreeParserVisitor.java:1130)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitReturnExpression(KotlinTreeParserVisitor.java:74)
  org.jetbrains.kotlin.psi.KtReturnExpression.accept(KtReturnExpression.java:33)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitBlockExpression(KotlinTreeParserVisitor.java:1948)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitBlockExpression(KotlinTreeParserVisitor.java:74)
  org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:79)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitNamedFunction0(KotlinTreeParserVisitor.java:2704)
  org.openrewrite.kotlin.internal.KotlinTreeParserVisitor.visitNamedFunction(KotlinTreeParserVisitor.java:2593)
  ...

The problematic code is the following else if: https://github.com/openrewrite/rewrite-kotlin/blob/301e3718aa3a7237dff0209ed7c54e159c75bedb/src/main/kotlin/org/openrewrite/kotlin/KotlinTypeMapping.kt#L796-L800

In the call there may not be any argument to match the formal parameter (in the example the call only declares an argument for i but none for j).