diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateToThisAccessors.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateToThisAccessors.kt new file mode 100644 index 00000000000..1a3a6a8d801 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateToThisAccessors.kt @@ -0,0 +1,16 @@ +import kotlin.reflect.jvm.* + +class K { + private var t: T + get() = "OK" as T + set(value) {} + + fun run(): String { + val p = ::t + p.accessible = true + p.set(this, "" as T) + return p.get(this) + } +} + +fun box() = K().run() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index f85599394b4..cba6d8798d4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -3038,6 +3038,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("privateToThisAccessors.kt") + public void testPrivateToThisAccessors() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/privateToThisAccessors.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("propertyOfNestedClassAndArrayType.kt") public void testPropertyOfNestedClassAndArrayType() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/propertyOfNestedClassAndArrayType.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt index ce9ee612f05..8ec141e7f7e 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt @@ -17,6 +17,7 @@ package kotlin.reflect.jvm.internal import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.NameResolver @@ -60,13 +61,15 @@ abstract class DescriptorBasedProperty(computeDescriptor: () -> PropertyDescript open val getter: Method? by ReflectProperties.lazySoft { val proto = protoData if (proto == null || !proto.signature.hasGetter()) null - else container.findMethodBySignature(proto.signature.getGetter(), proto.nameResolver) + else container.findMethodBySignature(proto.signature.getGetter(), proto.nameResolver, + descriptor.getGetter()?.getVisibility()?.let { Visibilities.isPrivate(it) } ?: false) } open val setter: Method? by ReflectProperties.lazySoft { val proto = protoData if (proto == null || !proto.signature.hasSetter()) null - else container.findMethodBySignature(proto.signature.getSetter(), proto.nameResolver) + else container.findMethodBySignature(proto.signature.getSetter(), proto.nameResolver, + descriptor.getSetter()?.getVisibility()?.let { Visibilities.isPrivate(it) } ?: false) } override fun equals(other: Any?): Boolean = diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableContainerImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableContainerImpl.kt index 2ac5d0f2b58..893ceeca3de 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableContainerImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableContainerImpl.kt @@ -68,14 +68,16 @@ abstract class KCallableContainerImpl { } // TODO: check resulting method's return type - fun findMethodBySignature(signature: JvmProtoBuf.JvmMethodSignature, nameResolver: NameResolver): Method? { + fun findMethodBySignature(signature: JvmProtoBuf.JvmMethodSignature, nameResolver: NameResolver, declared: Boolean): Method? { val name = nameResolver.getString(signature.getName()) val classLoader = jClass.classLoader val parameterTypes = signature.getParameterTypeList().map { jvmType -> loadJvmType(jvmType, nameResolver, classLoader) }.copyToArray() + return try { - jClass.getMaybeDeclaredMethod(name, *parameterTypes) + if (declared) jClass.getDeclaredMethod(name, *parameterTypes) + else jClass.getMethod(name, *parameterTypes) } catch (e: NoSuchMethodException) { null @@ -112,16 +114,6 @@ abstract class KCallableContainerImpl { } } - private fun Class<*>.getMaybeDeclaredMethod(name: String, vararg parameterTypes: Class<*>): Method { - try { - return getMethod(name, *parameterTypes) - } - catch (e: NoSuchMethodException) { - // This is needed to support private methods - return getDeclaredMethod(name, *parameterTypes) - } - } - /* private // KT-5786 */ fun loadJvmType( type: JvmProtoBuf.JvmType, nameResolver: NameResolver,