33package com.github.codeql.utils.versions
44
55import org.jetbrains.kotlin.ir.declarations.IrFunction
6+ import org.jetbrains.kotlin.ir.declarations.IrParameterKind
67import org.jetbrains.kotlin.ir.declarations.IrValueParameter
78import org.jetbrains.kotlin.ir.expressions.IrAnnotation
89import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -21,33 +22,35 @@ import org.jetbrains.kotlin.ir.types.addAnnotations
2122 * have been removed. This file provides the 2.4.0 implementations.
2223 */
2324
24- // IrFunction: valueParameters -> parameters filtered to Regular kind
25+ private fun IrParameterKind.isCodeQlValueParameter () =
26+ this == IrParameterKind .Context || this == IrParameterKind .Regular
27+
28+ // IrFunction: valueParameters -> context and regular parameters
2529val IrFunction .codeQlValueParameters: List <IrValueParameter >
26- get() = parameters.filter { it.kind == org.jetbrains.kotlin.ir.declarations. IrParameterKind . Regular }
30+ get() = parameters.filter { it.kind.isCodeQlValueParameter() }
2731
2832// IrFunction: extensionReceiverParameter
2933val IrFunction .codeQlExtensionReceiverParameter: IrValueParameter ?
3034 get() = parameters.firstOrNull { it.kind == org.jetbrains.kotlin.ir.declarations.IrParameterKind .ExtensionReceiver }
3135
32- // Helper: get the offset of value arguments in the arguments list
33- private fun IrMemberAccessExpression <* >.valueArgumentOffset (): Int {
34- val owner = symbol.owner as ? IrFunction ? : return 0
35- return owner.parameters.count { it.kind != org.jetbrains.kotlin.ir.declarations.IrParameterKind .Regular }
36+ private fun IrMemberAccessExpression <* >.valueArgumentIndices (): List <Int > {
37+ val owner = symbol.owner as ? IrFunction ? : return arguments.indices.toList()
38+ return owner.parameters.mapIndexedNotNull { index, parameter ->
39+ index.takeIf { parameter.kind.isCodeQlValueParameter() }
40+ }
3641}
3742
3843// IrMemberAccessExpression: valueArgumentsCount
39- // In 2.4.0, arguments[] includes dispatch/extension receivers before regular params
4044val IrMemberAccessExpression <* >.codeQlValueArgumentsCount: Int
41- get() = arguments.size - valueArgumentOffset()
45+ get() = valueArgumentIndices().size
4246
4347// IrMemberAccessExpression: getValueArgument
44- // In 2.4.0, arguments[] includes dispatch/extension receivers before regular params
45- fun IrMemberAccessExpression < * >. codeQlGetValueArgument ( index : Int ): IrExpression ? = arguments[index + valueArgumentOffset() ]
48+ fun IrMemberAccessExpression < * >. codeQlGetValueArgument ( index : Int ): IrExpression ? =
49+ arguments[valueArgumentIndices()[index] ]
4650
4751// IrMemberAccessExpression: putValueArgument
48- // In 2.4.0, arguments[] includes dispatch/extension receivers before regular params
4952fun IrMemberAccessExpression <* >.codeQlPutValueArgument (index : Int , value : IrExpression ? ) {
50- arguments[index + valueArgumentOffset() ] = value
53+ arguments[valueArgumentIndices()[index] ] = value
5154}
5255
5356// Re-add accessor for the extensionReceiver property removed in Kotlin 2.4.0.
0 commit comments