KT-51863 Account for context receivers in calls with changed parameter order
This commit is contained in:
committed by
Space Team
parent
e9984ce38d
commit
25ad7fe31c
+6
@@ -17456,6 +17456,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51863.kt")
|
||||
public void testKt51863() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("overload.kt")
|
||||
public void testOverload() throws Exception {
|
||||
|
||||
@@ -406,26 +406,26 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
||||
irCall: IrFunctionAccessExpression,
|
||||
irResultType: IrType,
|
||||
contextReceivers: List<IrExpression>
|
||||
): IrExpression =
|
||||
if (call.isValueArgumentReorderingRequired()) {
|
||||
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType)
|
||||
): IrExpression {
|
||||
contextReceivers.forEachIndexed(irCall::putValueArgument)
|
||||
return if (call.isValueArgumentReorderingRequired()) {
|
||||
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType, contextReceivers.size)
|
||||
} else {
|
||||
for ((index, valueArgument) in contextReceivers.withIndex()) {
|
||||
irCall.putValueArgument(index, valueArgument)
|
||||
}
|
||||
val valueArguments = call.getValueArgumentsInParameterOrder()
|
||||
for ((index, valueArgument) in valueArguments.withIndex()) {
|
||||
irCall.putValueArgument(index + contextReceivers.size, valueArgument)
|
||||
}
|
||||
irCall
|
||||
}
|
||||
}
|
||||
|
||||
private fun generateCallWithArgumentReordering(
|
||||
irCall: IrFunctionAccessExpression,
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
call: CallBuilder,
|
||||
irResultType: IrType
|
||||
irResultType: IrType,
|
||||
contextReceiversCount: Int
|
||||
): IrExpression {
|
||||
val irBlock = IrBlockImpl(startOffset, endOffset, irResultType, IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL)
|
||||
|
||||
@@ -447,7 +447,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
||||
for (valueArgument in resolvedCall.valueArguments.values) {
|
||||
val index = valueArgumentsToIndex[valueArgument]!!
|
||||
val irArgument = call.getValueArgument(valueParameters[index]) ?: continue
|
||||
irCall.putValueArgument(index, irArgument.freeze(valueParameters[index].name.asString()))
|
||||
irCall.putValueArgument(index + contextReceiversCount, irArgument.freeze(valueParameters[index].name.asString()))
|
||||
}
|
||||
irBlock.statements.add(irCall)
|
||||
return irBlock
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// !LANGUAGE: +ContextReceivers
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// WITH_STDLIB
|
||||
|
||||
import kotlin.test.*
|
||||
|
||||
context(String, List<String>)
|
||||
fun test(x: Any, y: Int = 0): List<Any> = listOf(this@String, this@List, x, y)
|
||||
|
||||
fun box(): String {
|
||||
with("context1") {
|
||||
with(listOf("context2")) {
|
||||
assertEquals(
|
||||
listOf("context1", listOf("context2"), listOf(1), 1),
|
||||
test(y = 1, x = listOf(1))
|
||||
)
|
||||
}
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -17456,6 +17456,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51863.kt")
|
||||
public void testKt51863() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("overload.kt")
|
||||
public void testOverload() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user