Call getMethod/getDeclaredMethod depending on visibility
This commit is contained in:
+16
@@ -0,0 +1,16 @@
|
|||||||
|
import kotlin.reflect.jvm.*
|
||||||
|
|
||||||
|
class K<in T : String> {
|
||||||
|
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<String>().run()
|
||||||
+6
@@ -3038,6 +3038,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
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")
|
@TestMetadata("propertyOfNestedClassAndArrayType.kt")
|
||||||
public void testPropertyOfNestedClassAndArrayType() throws Exception {
|
public void testPropertyOfNestedClassAndArrayType() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/propertyOfNestedClassAndArrayType.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/propertyOfNestedClassAndArrayType.kt");
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package kotlin.reflect.jvm.internal
|
package kotlin.reflect.jvm.internal
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||||
@@ -60,13 +61,15 @@ abstract class DescriptorBasedProperty(computeDescriptor: () -> PropertyDescript
|
|||||||
open val getter: Method? by ReflectProperties.lazySoft {
|
open val getter: Method? by ReflectProperties.lazySoft {
|
||||||
val proto = protoData
|
val proto = protoData
|
||||||
if (proto == null || !proto.signature.hasGetter()) null
|
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 {
|
open val setter: Method? by ReflectProperties.lazySoft {
|
||||||
val proto = protoData
|
val proto = protoData
|
||||||
if (proto == null || !proto.signature.hasSetter()) null
|
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 =
|
override fun equals(other: Any?): Boolean =
|
||||||
|
|||||||
@@ -68,14 +68,16 @@ abstract class KCallableContainerImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check resulting method's return type
|
// 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 name = nameResolver.getString(signature.getName())
|
||||||
val classLoader = jClass.classLoader
|
val classLoader = jClass.classLoader
|
||||||
val parameterTypes = signature.getParameterTypeList().map { jvmType ->
|
val parameterTypes = signature.getParameterTypeList().map { jvmType ->
|
||||||
loadJvmType(jvmType, nameResolver, classLoader)
|
loadJvmType(jvmType, nameResolver, classLoader)
|
||||||
}.copyToArray()
|
}.copyToArray()
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
jClass.getMaybeDeclaredMethod(name, *parameterTypes)
|
if (declared) jClass.getDeclaredMethod(name, *parameterTypes)
|
||||||
|
else jClass.getMethod(name, *parameterTypes)
|
||||||
}
|
}
|
||||||
catch (e: NoSuchMethodException) {
|
catch (e: NoSuchMethodException) {
|
||||||
null
|
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(
|
/* private // KT-5786 */ fun loadJvmType(
|
||||||
type: JvmProtoBuf.JvmType,
|
type: JvmProtoBuf.JvmType,
|
||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
|
|||||||
Reference in New Issue
Block a user