KT-11943 Do not use intrinsic 'java' property if receiver type is not acceptable
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
val <T : KClass<*>> T.myjava1: Class<*>
|
||||
get() = java
|
||||
|
||||
val <E : Any, T : KClass<E>> T.myjava2: Class<E>
|
||||
get() = java
|
||||
|
||||
class O
|
||||
class K
|
||||
|
||||
fun box(): String =
|
||||
O::class.myjava1.getSimpleName() + K::class.myjava2.getSimpleName()
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user