diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaProperty.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaProperty.kt index 4ca6d52c10a..04fc9b95964 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaProperty.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaProperty.kt @@ -16,10 +16,12 @@ package org.jetbrains.kotlin.codegen.intrinsics +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall @@ -31,8 +33,8 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class KClassJavaProperty : IntrinsicPropertyGetter() { override fun generate(resolvedCall: ResolvedCall<*>?, codegen: ExpressionCodegen, returnType: Type, receiver: StackValue): StackValue? { - val extensionReceiver = resolvedCall!!.extensionReceiver!! - val type = extensionReceiver.type.arguments.single().type + val receiverType = resolvedCall!!.extensionReceiver!!.type + val type = getKClassTypeArgument(receiverType) ?: return null val asmType = codegen.state.typeMapper.mapType(type) return when { @@ -58,6 +60,14 @@ class KClassJavaProperty : IntrinsicPropertyGetter() { } } + private fun getKClassTypeArgument(type: KotlinType): KotlinType? { + val typeClassifier = type.constructor.declarationDescriptor + return if (typeClassifier is ClassDescriptor && KotlinBuiltIns.isKClass(typeClassifier)) + type.arguments.singleOrNull()?.type + else + null + } + private fun isReifiedTypeParameter(type: KotlinType): Boolean { val typeDescriptor = type.constructor.declarationDescriptor return typeDescriptor is TypeParameterDescriptor && typeDescriptor.isReified diff --git a/compiler/testData/codegen/box/reflection/javaProperties/kt11943.kt b/compiler/testData/codegen/box/reflection/javaProperties/kt11943.kt new file mode 100644 index 00000000000..1a256ca2da3 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/javaProperties/kt11943.kt @@ -0,0 +1,16 @@ +// WITH_REFLECT + +import kotlin.reflect.KClass + +val > T.myjava1: Class<*> + get() = java + +val > T.myjava2: Class + get() = java + +class O +class K + +fun box(): String = + O::class.myjava1.getSimpleName() + K::class.myjava2.getSimpleName() + diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 036f5d2d88b..bbacfbb562f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11285,6 +11285,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/javaProperties/javaReified.kt"); doTest(fileName); } + + @TestMetadata("kt11943.kt") + public void testKt11943() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/javaProperties/kt11943.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/reflection/kClassInAnnotation")