Fix isAccessible for property accessors
This commit is contained in:
+41
@@ -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"
|
||||
}
|
||||
+6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user