Fix isAccessible for property accessors

This commit is contained in:
Alexander Udalov
2015-08-04 21:40:21 +03:00
parent 9f2feb1d27
commit a91729e041
3 changed files with 61 additions and 0 deletions
@@ -0,0 +1,41 @@
import kotlin.reflect.*
import kotlin.reflect.jvm.*
import kotlin.test.*
class A(private var foo: String)
fun box(): String {
val a = A("")
val foo = A::class.memberProperties.single() as KMutableProperty1<A, String>
assertTrue(!foo.isAccessible)
assertTrue(!foo.getter.isAccessible)
assertTrue(!foo.setter.isAccessible)
val setter = foo.setter
setter.isAccessible = true
assertTrue(setter.isAccessible)
assertTrue(foo.setter.isAccessible)
// After we invoked isAccessible on a setter, the underlying field and thus the getter are also accessible
assertTrue(foo.isAccessible)
assertTrue(foo.getter.isAccessible)
setter.call(a, "A")
assertEquals("A", foo.getter.call(a))
setter.isAccessible = false
assertFalse(setter.isAccessible)
assertFalse(foo.setter.isAccessible)
assertFalse(foo.getter.isAccessible)
assertFalse(foo.isAccessible)
val getter = foo.getter
getter.isAccessible = true
assertTrue(setter.isAccessible)
assertTrue(foo.setter.isAccessible)
assertTrue(foo.isAccessible)
assertTrue(foo.getter.isAccessible)
assertTrue(getter.isAccessible)
return "OK"
}
@@ -3537,6 +3537,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
doTestWithStdlib(fileName);
}
@TestMetadata("privatePropertyCallIsAccessibleOnAccessors.kt")
public void testPrivatePropertyCallIsAccessibleOnAccessors() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/privatePropertyCallIsAccessibleOnAccessors.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("privateToThisAccessors.kt")
public void testPrivateToThisAccessors() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/properties/privateToThisAccessors.kt");
@@ -42,6 +42,12 @@ public var KCallable<*>.isAccessible: Boolean
is KProperty ->
javaField?.isAccessible ?: true &&
javaGetter?.isAccessible ?: true
is KProperty.Getter ->
property.javaField?.isAccessible ?: true &&
javaMethod?.isAccessible ?: true
is KMutableProperty.Setter<*> ->
property.javaField?.isAccessible ?: true &&
javaMethod?.isAccessible ?: true
is KFunction ->
javaMethod?.isAccessible ?: true &&
this.javaConstructor?.isAccessible ?: true
@@ -59,6 +65,14 @@ public var KCallable<*>.isAccessible: Boolean
javaField?.isAccessible = value
javaGetter?.isAccessible = value
}
is KProperty.Getter -> {
property.javaField?.isAccessible = value
javaMethod?.isAccessible = value
}
is KMutableProperty.Setter<*> -> {
property.javaField?.isAccessible = value
javaMethod?.isAccessible = value
}
is KFunction -> {
javaMethod?.isAccessible = value
this.javaConstructor?.isAccessible = value