From e441f0509f40edcae5000d42890245603e6b218e Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 18 Apr 2016 16:43:49 +0300 Subject: [PATCH] KT-11943 Do not use intrinsic 'java' property if receiver type is not acceptable --- .../codegen/intrinsics/KClassJavaProperty.kt | 14 ++++++++++++-- .../box/reflection/javaProperties/kt11943.kt | 16 ++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/javaProperties/kt11943.kt 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")