From a91729e0419d2c14d124f7883920c1697eca66af Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 4 Aug 2015 21:40:21 +0300 Subject: [PATCH] Fix isAccessible for property accessors --- ...vatePropertyCallIsAccessibleOnAccessors.kt | 41 +++++++++++++++++++ ...lackBoxWithStdlibCodegenTestGenerated.java | 6 +++ .../src/kotlin/reflect/jvm/callables.kt | 14 +++++++ 3 files changed, 61 insertions(+) create mode 100644 compiler/testData/codegen/boxWithStdlib/reflection/properties/privatePropertyCallIsAccessibleOnAccessors.kt diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privatePropertyCallIsAccessibleOnAccessors.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privatePropertyCallIsAccessibleOnAccessors.kt new file mode 100644 index 00000000000..b85c30595dc --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privatePropertyCallIsAccessibleOnAccessors.kt @@ -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 + + 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" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index b98350e5cc7..66e30189982 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -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"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/callables.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/callables.kt index a25fd8dcd59..117eda98a18 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/callables.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/callables.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