JVM IR: do not use JvmMethodParameterKind
This commit is contained in:
committed by
Space Team
parent
d9bc714992
commit
8ad38db2ad
+3
-3
@@ -182,10 +182,10 @@ public class BothSignatureWriter extends JvmSignatureWriter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeParameterType(JvmMethodParameterKind parameterKind) {
|
||||
public void writeParameterType(@NotNull JvmMethodParameterKind parameterKind, boolean isSkippedInGenericSignature) {
|
||||
// This magic mimics the behavior of javac that enum constructor have these synthetic parameters in erased signature, but doesn't
|
||||
// have them in generic signature. IDEA, javac and their friends rely on this behavior.
|
||||
if (parameterKind.isSkippedInGenericSignature()) {
|
||||
if (isSkippedInGenericSignature) {
|
||||
generic = true;
|
||||
|
||||
// pushing dummy visitor, because we don't want these parameters to appear in generic JVM signature
|
||||
@@ -194,7 +194,7 @@ public class BothSignatureWriter extends JvmSignatureWriter {
|
||||
else {
|
||||
push(signatureVisitor().visitParameterType());
|
||||
}
|
||||
super.writeParameterType(parameterKind);
|
||||
super.writeParameterType(parameterKind, isSkippedInGenericSignature);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-1
@@ -98,7 +98,11 @@ public class JvmSignatureWriter extends JvmDescriptorTypeWriter<Type> {
|
||||
clearCurrentType();
|
||||
}
|
||||
|
||||
public void writeParameterType(JvmMethodParameterKind parameterKind) {
|
||||
public void writeParameterType(@NotNull JvmMethodParameterKind parameterKind) {
|
||||
writeParameterType(parameterKind, parameterKind.isSkippedInGenericSignature());
|
||||
}
|
||||
|
||||
public void writeParameterType(@NotNull JvmMethodParameterKind parameterKind, boolean isSkippedInGenericSignature) {
|
||||
currentParameterKind = parameterKind;
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -272,7 +272,7 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
|
||||
) {
|
||||
val iterator = irFunction.valueParameters.iterator()
|
||||
val kotlinParameterTypes = jvmSignature.valueParameters
|
||||
val syntheticParameterCount = kotlinParameterTypes.count { it.kind.isSkippedInGenericSignature }
|
||||
val syntheticParameterCount = irFunction.valueParameters.count { it.isSkippedInGenericSignature }
|
||||
|
||||
visitAnnotableParameterCount(mv, kotlinParameterTypes.size - syntheticParameterCount)
|
||||
|
||||
@@ -283,7 +283,7 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
|
||||
else
|
||||
iterator.next()
|
||||
|
||||
if (!parameterSignature.kind.isSkippedInGenericSignature && !annotated.isSyntheticMarkerParameter()) {
|
||||
if (i >= syntheticParameterCount && !annotated.isSyntheticMarkerParameter()) {
|
||||
object : AnnotationCodegen(classCodegen, skipNullabilityAnnotations) {
|
||||
override fun visitAnnotation(descr: String, visible: Boolean): AnnotationVisitor {
|
||||
return mv.visitParameterAnnotation(
|
||||
|
||||
@@ -551,3 +551,7 @@ fun IrClass.findEnumValuesFunction(context: JvmBackendContext): IrSimpleFunction
|
||||
&& it.returnType.isBoxedArray
|
||||
&& it.returnType.getArrayElementType(context.irBuiltIns).classOrNull == this.symbol
|
||||
}
|
||||
|
||||
val IrValueParameter.isSkippedInGenericSignature: Boolean
|
||||
get() = origin == JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS ||
|
||||
origin == JvmLoweredDeclarationOrigin.ENUM_CONSTRUCTOR_SYNTHETIC_PARAMETER
|
||||
|
||||
+5
-10
@@ -254,26 +254,21 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
|
||||
for (i in 0 until function.contextReceiverParametersCount) {
|
||||
val contextReceiver = function.valueParameters[i]
|
||||
writeParameter(sw, JvmMethodParameterKind.VALUE, contextReceiver.type, function)
|
||||
writeParameter(sw, false, contextReceiver.type, function)
|
||||
}
|
||||
|
||||
val receiverParameter = function.extensionReceiverParameter
|
||||
if (receiverParameter != null) {
|
||||
writeParameter(sw, JvmMethodParameterKind.VALUE, receiverParameter.type, function)
|
||||
writeParameter(sw, false, receiverParameter.type, function)
|
||||
}
|
||||
|
||||
for (i in function.contextReceiverParametersCount until function.valueParameters.size) {
|
||||
val parameter = function.valueParameters[i]
|
||||
val kind = when (parameter.origin) {
|
||||
JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS -> JvmMethodParameterKind.OUTER
|
||||
JvmLoweredDeclarationOrigin.ENUM_CONSTRUCTOR_SYNTHETIC_PARAMETER -> JvmMethodParameterKind.ENUM_NAME_OR_ORDINAL
|
||||
else -> JvmMethodParameterKind.VALUE
|
||||
}
|
||||
val type =
|
||||
if (shouldBoxSingleValueParameterForSpecialCaseOfRemove(function))
|
||||
parameter.type.makeNullable()
|
||||
else parameter.type
|
||||
writeParameter(sw, kind, type, function, materialized)
|
||||
writeParameter(sw, parameter.isSkippedInGenericSignature, type, function, materialized)
|
||||
}
|
||||
|
||||
sw.writeReturnType()
|
||||
@@ -337,12 +332,12 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
|
||||
private fun writeParameter(
|
||||
sw: JvmSignatureWriter,
|
||||
kind: JvmMethodParameterKind,
|
||||
isSkippedInGenericSignature: Boolean,
|
||||
type: IrType,
|
||||
function: IrFunction,
|
||||
materialized: Boolean = true
|
||||
) {
|
||||
sw.writeParameterType(kind)
|
||||
sw.writeParameterType(JvmMethodParameterKind.VALUE, isSkippedInGenericSignature)
|
||||
writeParameterType(sw, type, function, materialized)
|
||||
sw.writeParameterTypeEnd()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user