[BE] Put context receivers before an extension receiver
This commit is contained in:
committed by
TeamCityServer
parent
814777ba8c
commit
a2403c470f
+12
-8
@@ -479,6 +479,16 @@ class ExpressionCodegen(
|
||||
callGenerator.genValueAndPut(callee.dispatchReceiverParameter!!, receiver, type, this, data)
|
||||
}
|
||||
|
||||
fun handleValueParameter(i: Int, irParameter: IrValueParameter) {
|
||||
val arg = expression.getValueArgument(i)
|
||||
val parameterType = callable.valueParameterTypes[i]
|
||||
require(arg != null) { "Null argument in ExpressionCodegen for parameter ${irParameter.render()}" }
|
||||
callGenerator.genValueAndPut(irParameter, arg, parameterType, this, data)
|
||||
}
|
||||
|
||||
val contextReceivers = callee.valueParameters.subList(0, callee.contextReceiverParametersCount)
|
||||
contextReceivers.forEachIndexed(::handleValueParameter)
|
||||
|
||||
expression.extensionReceiver?.let { receiver ->
|
||||
val type = callable.signature.valueParameters.singleOrNull { it.kind == JvmMethodParameterKind.RECEIVER }?.asmType
|
||||
?: error("No single extension receiver parameter: ${callable.signature.valueParameters}")
|
||||
@@ -486,14 +496,8 @@ class ExpressionCodegen(
|
||||
}
|
||||
|
||||
callGenerator.beforeValueParametersStart()
|
||||
expression.symbol.owner.valueParameters.forEachIndexed { i, irParameter ->
|
||||
val arg = expression.getValueArgument(i)
|
||||
val parameterType = callable.valueParameterTypes[i]
|
||||
require(arg != null) {
|
||||
"Null argument in ExpressionCodegen for parameter ${irParameter.render()}"
|
||||
}
|
||||
callGenerator.genValueAndPut(irParameter, arg, parameterType, this, data)
|
||||
}
|
||||
callee.valueParameters.subList(callee.contextReceiverParametersCount, callee.valueParameters.size)
|
||||
.forEachIndexed { i, valueParameter -> handleValueParameter(i + contextReceivers.size, valueParameter) }
|
||||
|
||||
expression.markLineNumber(true)
|
||||
|
||||
|
||||
+6
-1
@@ -253,10 +253,15 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
|
||||
receiver?.let {
|
||||
frameMap.enter(it, context.typeMapper.mapTypeAsDeclaration(it.type))
|
||||
}
|
||||
val contextReceivers = valueParameters.subList(0, contextReceiverParametersCount)
|
||||
for (contextReceiver in contextReceivers) {
|
||||
frameMap.enter(contextReceiver, context.typeMapper.mapType(contextReceiver.type))
|
||||
}
|
||||
extensionReceiverParameter?.let {
|
||||
frameMap.enter(it, context.typeMapper.mapType(it))
|
||||
}
|
||||
for (parameter in valueParameters) {
|
||||
val regularParameters = valueParameters.subList(contextReceiverParametersCount, valueParameters.size)
|
||||
for (parameter in regularParameters) {
|
||||
frameMap.enter(parameter, context.typeMapper.mapType(parameter.type))
|
||||
}
|
||||
return frameMap
|
||||
|
||||
+8
-1
@@ -241,12 +241,19 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
|
||||
|
||||
sw.writeParametersStart()
|
||||
|
||||
val contextReceivers = function.valueParameters.subList(0, function.contextReceiverParametersCount)
|
||||
for (contextReceiver in contextReceivers) {
|
||||
writeParameter(sw, JvmMethodParameterKind.CONTEXT_RECEIVER, contextReceiver.type, function)
|
||||
}
|
||||
|
||||
val receiverParameter = function.extensionReceiverParameter
|
||||
if (receiverParameter != null) {
|
||||
writeParameter(sw, JvmMethodParameterKind.RECEIVER, receiverParameter.type, function)
|
||||
}
|
||||
|
||||
for (parameter in function.valueParameters) {
|
||||
val regularValueParameters =
|
||||
function.valueParameters.subList(function.contextReceiverParametersCount, function.valueParameters.size)
|
||||
for (parameter in regularValueParameters) {
|
||||
val kind = when (parameter.origin) {
|
||||
JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS -> JvmMethodParameterKind.OUTER
|
||||
JvmLoweredDeclarationOrigin.ENUM_CONSTRUCTOR_SYNTHETIC_PARAMETER -> JvmMethodParameterKind.ENUM_NAME_OR_ORDINAL
|
||||
|
||||
Reference in New Issue
Block a user