[BE] Put context receivers before an extension receiver
This commit is contained in:
committed by
TeamCityServer
parent
814777ba8c
commit
a2403c470f
@@ -529,6 +529,7 @@ public class FunctionCodegen {
|
||||
}
|
||||
|
||||
ParameterDescriptor annotated =
|
||||
// TODO: Generate annotations for context receivers
|
||||
kind == JvmMethodParameterKind.VALUE
|
||||
? iterator.next()
|
||||
: kind == JvmMethodParameterKind.RECEIVER
|
||||
@@ -806,6 +807,7 @@ public class FunctionCodegen {
|
||||
: nameForDestructuredParameter;
|
||||
break;
|
||||
case RECEIVER:
|
||||
case CONTEXT_RECEIVER:
|
||||
parameterName = DescriptorAsmUtil.getNameForReceiverParameter(
|
||||
functionDescriptor, typeMapper.getBindingContext(), state.getLanguageVersionSettings());
|
||||
break;
|
||||
@@ -1330,7 +1332,7 @@ public class FunctionCodegen {
|
||||
}
|
||||
|
||||
for (JvmMethodParameterSignature parameter : signature.getValueParameters()) {
|
||||
if (parameter.getKind() == JvmMethodParameterKind.RECEIVER) {
|
||||
if (parameter.getKind() == JvmMethodParameterKind.RECEIVER || parameter.getKind() == JvmMethodParameterKind.CONTEXT_RECEIVER) {
|
||||
if (extensionReceiverParameter != null) {
|
||||
frameMap.enter(extensionReceiverParameter, state.getTypeMapper().mapType(extensionReceiverParameter));
|
||||
}
|
||||
|
||||
@@ -1888,7 +1888,7 @@ public abstract class StackValue {
|
||||
if (kind == JvmMethodParameterKind.VALUE) {
|
||||
break;
|
||||
}
|
||||
if (kind == JvmMethodParameterKind.RECEIVER || kind == JvmMethodParameterKind.THIS) {
|
||||
if (kind == JvmMethodParameterKind.CONTEXT_RECEIVER || kind == JvmMethodParameterKind.RECEIVER || kind == JvmMethodParameterKind.THIS) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,8 @@ fun generateParameterNames(
|
||||
isEnumName = !isEnumName
|
||||
if (!isEnumName) "\$enum\$name" else "\$enum\$ordinal"
|
||||
}
|
||||
JvmMethodParameterKind.RECEIVER -> {
|
||||
JvmMethodParameterKind.RECEIVER,
|
||||
JvmMethodParameterKind.CONTEXT_RECEIVER -> {
|
||||
DescriptorAsmUtil.getNameForReceiverParameter(functionDescriptor, state.bindingContext, state.languageVersionSettings)
|
||||
}
|
||||
JvmMethodParameterKind.OUTER -> AsmUtil.CAPTURED_THIS_FIELD
|
||||
@@ -67,7 +68,7 @@ fun generateParameterNames(
|
||||
// declared implicitly in source code (§8.8.1, §8.8.9, §8.9.3, §15.9.5.1).
|
||||
val access = when (kind) {
|
||||
JvmMethodParameterKind.ENUM_NAME_OR_ORDINAL -> Opcodes.ACC_SYNTHETIC
|
||||
JvmMethodParameterKind.RECEIVER -> Opcodes.ACC_MANDATED
|
||||
JvmMethodParameterKind.RECEIVER, JvmMethodParameterKind.CONTEXT_RECEIVER -> Opcodes.ACC_MANDATED
|
||||
JvmMethodParameterKind.OUTER -> Opcodes.ACC_MANDATED
|
||||
JvmMethodParameterKind.VALUE -> 0
|
||||
|
||||
|
||||
@@ -894,6 +894,10 @@ class KotlinTypeMapper @JvmOverloads constructor(
|
||||
writeParameter(sw, JvmMethodParameterKind.THIS, thisIfNeeded, f)
|
||||
}
|
||||
|
||||
for (contextReceiverParameter in f.contextReceiverParameters) {
|
||||
writeParameter(sw, JvmMethodParameterKind.CONTEXT_RECEIVER, contextReceiverParameter.type, f)
|
||||
}
|
||||
|
||||
val receiverParameter = f.extensionReceiverParameter
|
||||
if (receiverParameter != null) {
|
||||
writeParameter(sw, JvmMethodParameterKind.RECEIVER, receiverParameter.type, f)
|
||||
|
||||
Reference in New Issue
Block a user