diff --git a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/BothSignatureWriter.java b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/BothSignatureWriter.java index 5426d016919..20640ffc9e5 100644 --- a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/BothSignatureWriter.java +++ b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/BothSignatureWriter.java @@ -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 diff --git a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/JvmSignatureWriter.java b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/JvmSignatureWriter.java index 01b63b68910..2f88946234b 100644 --- a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/JvmSignatureWriter.java +++ b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/codegen/signature/JvmSignatureWriter.java @@ -98,7 +98,11 @@ public class JvmSignatureWriter extends JvmDescriptorTypeWriter { 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; } diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index daaf8f35800..47ddbc8c62e 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -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( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt index 833530a7c15..613006ddcb2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt @@ -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 diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/mapping/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/mapping/MethodSignatureMapper.kt index bc6f7d8f529..9b840c51307 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/mapping/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/mapping/MethodSignatureMapper.kt @@ -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() }