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");
|
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
|
@Test
|
||||||
@TestMetadata("overload.kt")
|
@TestMetadata("overload.kt")
|
||||||
public void testOverload() throws Exception {
|
public void testOverload() throws Exception {
|
||||||
|
|||||||
@@ -406,26 +406,26 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
|||||||
irCall: IrFunctionAccessExpression,
|
irCall: IrFunctionAccessExpression,
|
||||||
irResultType: IrType,
|
irResultType: IrType,
|
||||||
contextReceivers: List<IrExpression>
|
contextReceivers: List<IrExpression>
|
||||||
): IrExpression =
|
): IrExpression {
|
||||||
if (call.isValueArgumentReorderingRequired()) {
|
contextReceivers.forEachIndexed(irCall::putValueArgument)
|
||||||
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType)
|
return if (call.isValueArgumentReorderingRequired()) {
|
||||||
|
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType, contextReceivers.size)
|
||||||
} else {
|
} else {
|
||||||
for ((index, valueArgument) in contextReceivers.withIndex()) {
|
|
||||||
irCall.putValueArgument(index, valueArgument)
|
|
||||||
}
|
|
||||||
val valueArguments = call.getValueArgumentsInParameterOrder()
|
val valueArguments = call.getValueArgumentsInParameterOrder()
|
||||||
for ((index, valueArgument) in valueArguments.withIndex()) {
|
for ((index, valueArgument) in valueArguments.withIndex()) {
|
||||||
irCall.putValueArgument(index + contextReceivers.size, valueArgument)
|
irCall.putValueArgument(index + contextReceivers.size, valueArgument)
|
||||||
}
|
}
|
||||||
irCall
|
irCall
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun generateCallWithArgumentReordering(
|
private fun generateCallWithArgumentReordering(
|
||||||
irCall: IrFunctionAccessExpression,
|
irCall: IrFunctionAccessExpression,
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
call: CallBuilder,
|
call: CallBuilder,
|
||||||
irResultType: IrType
|
irResultType: IrType,
|
||||||
|
contextReceiversCount: Int
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val irBlock = IrBlockImpl(startOffset, endOffset, irResultType, IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL)
|
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) {
|
for (valueArgument in resolvedCall.valueArguments.values) {
|
||||||
val index = valueArgumentsToIndex[valueArgument]!!
|
val index = valueArgumentsToIndex[valueArgument]!!
|
||||||
val irArgument = call.getValueArgument(valueParameters[index]) ?: continue
|
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)
|
irBlock.statements.add(irCall)
|
||||||
return irBlock
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("overload.kt")
|
@TestMetadata("overload.kt")
|
||||||
public void testOverload() throws Exception {
|
public void testOverload() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user