KT-51284 Fix SAM conversion for methods with context receivers
This commit is contained in:
committed by
Space Team
parent
cc9beb466e
commit
4676072137
+6
@@ -17456,6 +17456,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51284.kt")
|
||||
public void testKt51284() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51863.kt")
|
||||
public void testKt51863() throws Exception {
|
||||
|
||||
@@ -387,12 +387,15 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB
|
||||
val parameterTypes = valueParameters.map {
|
||||
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: ConeErrorType(ConeIntermediateDiagnostic("No type for parameter $it"))
|
||||
}
|
||||
|
||||
val contextReceiversTypes = contextReceivers.map {
|
||||
it.typeRef.coneTypeSafe<ConeKotlinType>() ?: ConeErrorType(ConeIntermediateDiagnostic("No type for context receiver $it"))
|
||||
}
|
||||
return createFunctionalType(
|
||||
parameterTypes,
|
||||
receiverType = receiverParameter?.typeRef?.coneType,
|
||||
rawReturnType = returnTypeRef.coneType,
|
||||
isSuspend = this.isSuspend
|
||||
isSuspend = this.isSuspend,
|
||||
contextReceivers = contextReceiversTypes
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// !LANGUAGE: +ContextReceivers
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
|
||||
class Context
|
||||
|
||||
fun interface SAM {
|
||||
context(Context)
|
||||
fun foo(x: Int): Int
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val sam1 = SAM { x -> x + 1 }
|
||||
val sam2 = SAM { 2 }
|
||||
val sam3 = SAM { it + 1 }
|
||||
|
||||
with(Context()) {
|
||||
sam1.foo(0)
|
||||
sam2.foo(0)
|
||||
sam3.foo(0)
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -17456,6 +17456,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51284.kt")
|
||||
public void testKt51284() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt51863.kt")
|
||||
public void testKt51863() throws Exception {
|
||||
|
||||
@@ -77,14 +77,14 @@ fun getFunctionTypeForAbstractMethod(
|
||||
val parameterNames = ArrayList<Name>(valueParameters.size)
|
||||
|
||||
val contextReceiversTypes = function.contextReceiverParameters.map { it.type }
|
||||
var startIndex = contextReceiversTypes.size
|
||||
var startIndex = 0
|
||||
var receiverType: KotlinType? = null
|
||||
val extensionReceiver = function.extensionReceiverParameter
|
||||
if (extensionReceiver != null) {
|
||||
receiverType = extensionReceiver.type
|
||||
} else if (shouldConvertFirstParameterToDescriptor && function.valueParameters.isNotEmpty()) {
|
||||
receiverType = valueParameters[0].type
|
||||
startIndex += 1
|
||||
startIndex = 1
|
||||
}
|
||||
|
||||
for (i in startIndex until valueParameters.size) {
|
||||
|
||||
Reference in New Issue
Block a user