Skip to content

Commit ce8a701

Browse files
Kotlin: extract context parameters
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 486e8fe commit ce8a701

1 file changed

Lines changed: 15 additions & 12 deletions

File tree

  • java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0

java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_0/IrCompat.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package com.github.codeql.utils.versions
44

55
import org.jetbrains.kotlin.ir.declarations.IrFunction
6+
import org.jetbrains.kotlin.ir.declarations.IrParameterKind
67
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
78
import org.jetbrains.kotlin.ir.expressions.IrAnnotation
89
import 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
2529
val 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
2933
val 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
4044
val 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
4952
fun 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

Comments
 (0)