From 972304434231f71052ac44ec3ccc9ddbeeaeb592 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Thu, 4 Jun 2026 17:30:40 +0200 Subject: [PATCH] Kotlin 2.4.0: Fix value argument indexing in compat layer In 2.4.0, IrMemberAccessExpression.arguments includes all parameters (dispatch receiver, extension receiver, and regular value args). The old getValueArgument/putValueArgument/valueArgumentsCount APIs indexed only value arguments. Fix the compat layer to apply the correct offset when translating between the old index-based API and the new unified arguments list. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../main/kotlin/utils/versions/v_2_4_0/IrCompat.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0/IrCompat.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0/IrCompat.kt index 87fe52b3c29..1d010b0996c 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0/IrCompat.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0/IrCompat.kt @@ -26,16 +26,23 @@ val IrFunction.codeQlValueParameters: List val IrFunction.codeQlExtensionReceiverParameter: IrValueParameter? get() = parameters.firstOrNull { it.kind == org.jetbrains.kotlin.ir.declarations.IrParameterKind.ExtensionReceiver } +// Helper: get the offset of value arguments in the arguments list +// In 2.4.0, arguments[] includes dispatch/extension receivers before regular params +private fun IrMemberAccessExpression<*>.valueArgumentOffset(): Int { + val owner = symbol.owner as? IrFunction ?: return 0 + return owner.parameters.count { it.kind != org.jetbrains.kotlin.ir.declarations.IrParameterKind.Regular } +} + // IrMemberAccessExpression: valueArgumentsCount val IrMemberAccessExpression<*>.codeQlValueArgumentsCount: Int - get() = arguments.size + get() = arguments.size - valueArgumentOffset() // IrMemberAccessExpression: getValueArgument -fun IrMemberAccessExpression<*>.codeQlGetValueArgument(index: Int): IrExpression? = arguments[index] +fun IrMemberAccessExpression<*>.codeQlGetValueArgument(index: Int): IrExpression? = arguments[index + valueArgumentOffset()] // IrMemberAccessExpression: putValueArgument fun IrMemberAccessExpression<*>.codeQlPutValueArgument(index: Int, value: IrExpression?) { - arguments[index] = value + arguments[index + valueArgumentOffset()] = value } // IrMemberAccessExpression: extensionReceiver