diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt index 75875ce9248..dc2b5330356 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt @@ -137,7 +137,7 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas arrayElementType = AsmTypes.OBJECT_TYPE sw?.writeClass(arrayElementType) } else { - arrayElementType = mapType(memberType, mode.toGenericArgumentMode(variance), sw) + arrayElementType = mapType(memberType, mode.toGenericArgumentMode(variance, ofArray = true), sw) } sw?.writeArrayEnd() diff --git a/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt b/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt index 9d186b614e7..768185f8cb3 100644 --- a/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt +++ b/compiler/testData/writeSignature/annotations/kArrayClassOfKClass.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - import kotlin.reflect.KClass annotation class Ann(val arg: Array>>) diff --git a/compiler/testData/writeSignature/annotations/kClassOfKClass.kt b/compiler/testData/writeSignature/annotations/kClassOfKClass.kt new file mode 100644 index 00000000000..1775dfc4ae7 --- /dev/null +++ b/compiler/testData/writeSignature/annotations/kClassOfKClass.kt @@ -0,0 +1,7 @@ +import kotlin.reflect.KClass + +annotation class Ann(val arg: KClass>) + +// method: Ann::arg +// jvm signature: ()Ljava/lang/Class; +// generic signature: ()Ljava/lang/Class<+Lkotlin/reflect/KClass<*>;>; diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteSignatureTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteSignatureTestGenerated.java index ce2129ac17c..328912ad86a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteSignatureTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteSignatureTestGenerated.java @@ -170,6 +170,11 @@ public class IrWriteSignatureTestGenerated extends AbstractIrWriteSignatureTest public void testKClassInt() throws Exception { runTest("compiler/testData/writeSignature/annotations/kClassInt.kt"); } + + @TestMetadata("kClassOfKClass.kt") + public void testKClassOfKClass() throws Exception { + runTest("compiler/testData/writeSignature/annotations/kClassOfKClass.kt"); + } } @TestMetadata("compiler/testData/writeSignature/callableReference") diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java index f08c3192249..1c9a85fc9eb 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java @@ -169,6 +169,11 @@ public class WriteSignatureTestGenerated extends AbstractWriteSignatureTest { public void testKClassInt() throws Exception { runTest("compiler/testData/writeSignature/annotations/kClassInt.kt"); } + + @TestMetadata("kClassOfKClass.kt") + public void testKClassOfKClass() throws Exception { + runTest("compiler/testData/writeSignature/annotations/kClassOfKClass.kt"); + } } @TestMetadata("compiler/testData/writeSignature/callableReference") diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt index 5e9a2dc85c3..7ae51774d80 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/TypeMappingMode.kt @@ -68,7 +68,7 @@ class TypeMappingMode private constructor( ) /** - * kotlin.reflect.KClass mapped to java.lang.Class + * kotlin.reflect.KClass mapped to java.lang.Class when at top level or in an array; * primitive types and inline class types are not boxed because types in annotations cannot be nullable * Other types mapped as DEFAULT */ @@ -77,7 +77,7 @@ class TypeMappingMode private constructor( isForAnnotationParameter = true, needPrimitiveBoxing = false, needInlineClassWrapping = false, - genericArgumentMode = TypeMappingMode(isForAnnotationParameter = true, genericArgumentMode = GENERIC_ARGUMENT) + genericArgumentMode = GENERIC_ARGUMENT ) @@ -89,48 +89,37 @@ class TypeMappingMode private constructor( @JvmStatic fun getOptimalModeForValueParameter( type: KotlinType - ) = getOptimalModeForSignaturePart(type, isForAnnotationParameter = false, canBeUsedInSupertypePosition = true) + ) = getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = true) @JvmStatic fun getOptimalModeForReturnType( type: KotlinType, isAnnotationMethod: Boolean - ) = getOptimalModeForSignaturePart(type, isForAnnotationParameter = isAnnotationMethod, canBeUsedInSupertypePosition = false) + ) = if (isAnnotationMethod) VALUE_FOR_ANNOTATION else getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false) - private fun getOptimalModeForSignaturePart( - type: KotlinType, - isForAnnotationParameter: Boolean, - canBeUsedInSupertypePosition: Boolean - ): TypeMappingMode { + private fun getOptimalModeForSignaturePart(type: KotlinType, canBeUsedInSupertypePosition: Boolean): TypeMappingMode { if (type.arguments.isEmpty()) return DEFAULT if (type.isInlineClassType() && shouldUseUnderlyingType(type)) { val underlyingType = computeUnderlyingType(type) if (underlyingType != null) { - return getOptimalModeForSignaturePart( - underlyingType, isForAnnotationParameter, canBeUsedInSupertypePosition - ).dontWrapInlineClassesMode() + return getOptimalModeForSignaturePart(underlyingType, canBeUsedInSupertypePosition).dontWrapInlineClassesMode() } } val contravariantArgumentMode = if (!canBeUsedInSupertypePosition) - TypeMappingMode( - isForAnnotationParameter = isForAnnotationParameter, - skipDeclarationSiteWildcards = false, - skipDeclarationSiteWildcardsIfPossible = true - ) + TypeMappingMode(skipDeclarationSiteWildcards = false, skipDeclarationSiteWildcardsIfPossible = true) else null val invariantArgumentMode = if (canBeUsedInSupertypePosition) - getOptimalModeForSignaturePart(type, isForAnnotationParameter, canBeUsedInSupertypePosition = false) + getOptimalModeForSignaturePart(type, canBeUsedInSupertypePosition = false) else null return TypeMappingMode( - isForAnnotationParameter = isForAnnotationParameter, skipDeclarationSiteWildcards = !canBeUsedInSupertypePosition, skipDeclarationSiteWildcardsIfPossible = true, genericContravariantArgumentMode = contravariantArgumentMode, @@ -153,8 +142,8 @@ class TypeMappingMode private constructor( ) } - fun toGenericArgumentMode(effectiveVariance: Variance): TypeMappingMode = - when (effectiveVariance) { + fun toGenericArgumentMode(effectiveVariance: Variance, ofArray: Boolean = false): TypeMappingMode = + if (ofArray && isForAnnotationParameter) this else when (effectiveVariance) { Variance.IN_VARIANCE -> genericContravariantArgumentMode ?: this Variance.INVARIANT -> genericInvariantArgumentMode ?: this else -> genericArgumentMode ?: this diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt index 0a7a3d2ed46..edf2754a9ec 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt @@ -121,8 +121,8 @@ fun mapType( descriptorTypeWriter?.writeArrayType() arrayElementType = mapType( - memberType, factory, mode.toGenericArgumentMode(memberProjection.projectionKind), typeMappingConfiguration, - descriptorTypeWriter, writeGenericType + memberType, factory, mode.toGenericArgumentMode(memberProjection.projectionKind, ofArray = true), + typeMappingConfiguration, descriptorTypeWriter, writeGenericType ) descriptorTypeWriter?.writeArrayEnd()