From 8f0885ca03b4adf7268fcdc0372fdfad81133808 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 23 Jul 2015 22:37:08 +0300 Subject: [PATCH] Rename KClass.properties and extensionProperties: prepend 'member' To better emphasize the fact that all returned properties require an instance of the class they are declared in. Another issue was that 'Some::class.extensionProperties' was sometimes incorrectly perceived as "get all extension properties available on the class Some" --- .../kotlinPropertyInheritedInJava/K.kt | 8 ++++---- .../reflection/call/privateProperty.kt | 2 +- .../reflection/call/propertyAccessors.kt | 4 ++-- .../methodsFromAny/memberExtensionToString.kt | 2 +- .../properties/accessors/accessorNames.kt | 2 +- .../properties/accessors/memberExtensions.kt | 2 +- .../reflection/properties/allVsDeclared.kt | 8 ++++---- .../callPrivatePropertyFromGetProperties.kt | 2 +- .../properties/fakeOverridesInSubclass.kt | 4 ++-- ...nericClassLiteralPropertyReceiverIsStar.kt | 2 +- ...getExtensionPropertiesMutableVsReadonly.kt | 2 +- .../getPropertiesMutableVsReadonly.kt | 2 +- .../memberAndMemberExtensionWithSameName.kt | 4 ++-- .../reflection/properties/privateClassVal.kt | 2 +- .../reflection/properties/privateClassVar.kt | 2 +- .../privateFakeOverrideFromSuperclass.kt | 4 ++-- .../properties/protectedClassVar.kt | 2 +- .../properties/simpleGetProperties.kt | 2 +- .../classLoaders/differentClassLoaders.kt | 4 ++-- .../src/kotlin/reflect/KClassExtensions.kt | 8 ++++---- .../src/kotlin/reflect/jvm/_Deprecated.kt | 19 ++++++++++++++++++- .../src/kotlin/reflect/jvm/mapping.kt | 2 +- 22 files changed, 53 insertions(+), 36 deletions(-) diff --git a/compiler/testData/codegen/boxWithJava/reflection/kotlinPropertyInheritedInJava/K.kt b/compiler/testData/codegen/boxWithJava/reflection/kotlinPropertyInheritedInJava/K.kt index 71c941f1bca..55c25777c33 100644 --- a/compiler/testData/codegen/boxWithJava/reflection/kotlinPropertyInheritedInJava/K.kt +++ b/compiler/testData/codegen/boxWithJava/reflection/kotlinPropertyInheritedInJava/K.kt @@ -22,17 +22,17 @@ fun box(): String { val klass = javaClass().kotlin - if (klass.declaredProperties.isNotEmpty()) return "Fail: declaredProperties should be empty" - if (klass.declaredExtensionProperties.isNotEmpty()) return "Fail: declaredExtensionProperties should be empty" + if (klass.declaredMemberProperties.isNotEmpty()) return "Fail: declaredMemberProperties should be empty" + if (klass.declaredMemberExtensionProperties.isNotEmpty()) return "Fail: declaredMemberExtensionProperties should be empty" - val prop2 = klass.properties.firstOrNull { it.name == "prop" } ?: "Fail: no 'prop' property in properties" + val prop2 = klass.memberProperties.firstOrNull { it.name == "prop" } ?: "Fail: no 'prop' property in memberProperties" if (prop != prop2) return "Fail: property references from :: and from properties differ: $prop != $prop2" if (prop2 !is KMutableProperty1<*, *>) return "Fail instanceof 2" (prop2 as KMutableProperty1).set(j, "::)") if (prop.get(j) != "::)") return "Fail get after 2: ${prop[j]}" - val ext = klass.extensionProperties.firstOrNull { it.name == "ext" } ?: "Fail: no 'ext' property in extensionProperties" + val ext = klass.memberExtensionProperties.firstOrNull { it.name == "ext" } ?: "Fail: no 'ext' property in memberExtensionProperties" ext as KProperty2 val fortyTwo = ext.get(j, 42) if (fortyTwo != 42) return "Fail ext get: $fortyTwo" diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/call/privateProperty.kt b/compiler/testData/codegen/boxWithStdlib/reflection/call/privateProperty.kt index 0d53e266847..2c45dd1eeaa 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/call/privateProperty.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/call/privateProperty.kt @@ -7,7 +7,7 @@ class A(private var result: String) fun box(): String { val a = A("abc") - val p = A::class.declaredProperties.single() as KMutableProperty1 + val p = A::class.declaredMemberProperties.single() as KMutableProperty1 p.accessible = true assertEquals("abc", p.call(a)) assertEquals(Unit, p.setter.call(a, "def")) diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/call/propertyAccessors.kt b/compiler/testData/codegen/boxWithStdlib/reflection/call/propertyAccessors.kt index 95b3ef9749a..0ed8a1c6ffa 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/call/propertyAccessors.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/call/propertyAccessors.kt @@ -26,7 +26,7 @@ fun box(): String { assertEquals(1, (::p0).getter.call()) assertEquals(2, (Int::p1).call(2)) assertEquals(2, (Int::p1).getter.call(2)) - val p2 = A::class.extensionProperties.single() + val p2 = A::class.memberExtensionProperties.single() assertEquals(3, p2.call(A(), 3)) assertEquals(3, p2.getter.call(A(), 3)) @@ -34,7 +34,7 @@ fun box(): String { assertEquals(1, (::mp0).getter.call()) assertEquals(2, (Int::mp1).call(2)) assertEquals(2, (Int::mp1).getter.call(2)) - val mp2 = B::class.extensionProperties.single() as KMutableProperty2 + val mp2 = B::class.memberExtensionProperties.single() as KMutableProperty2 assertEquals(3, mp2.call(B(), 3)) assertEquals(3, mp2.getter.call(B(), 3)) diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/memberExtensionToString.kt b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/memberExtensionToString.kt index 762c03732cc..dd06767a1bc 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/memberExtensionToString.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/memberExtensionToString.kt @@ -10,7 +10,7 @@ class A { } fun box(): String { - val p = javaClass().kotlin.extensionProperties.single() + val p = javaClass().kotlin.memberExtensionProperties.single() return if ("$p" == "var A.(kotlin.String.)id") "OK" else "Fail $p" val q = javaClass().kotlin.declaredFunctions.single() diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/accessorNames.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/accessorNames.kt index fdb3103603b..c5b09da74f2 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/accessorNames.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/accessorNames.kt @@ -22,7 +22,7 @@ fun box(): String { assertEquals("", A::baz.getter.name) assertEquals("", A::baz.setter.name) - val me = A::class.extensionProperties.single() as KMutableProperty2 + val me = A::class.memberExtensionProperties.single() as KMutableProperty2 assertEquals("", me.getter.name) assertEquals("", me.setter.name) diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/memberExtensions.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/memberExtensions.kt index 86d459b9192..481a3659536 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/memberExtensions.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/accessors/memberExtensions.kt @@ -8,7 +8,7 @@ class C(var state: String) { } fun box(): String { - val prop = C::class.extensionProperties.single() as KMutableProperty2 + val prop = C::class.memberExtensionProperties.single() as KMutableProperty2 val c = C("") assertEquals("3", prop.getter.invoke(c, "abc")) diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/allVsDeclared.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/allVsDeclared.kt index a35b106ffe7..ab2b6c06956 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/allVsDeclared.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/allVsDeclared.kt @@ -14,10 +14,10 @@ class Sub : Super() { fun box(): String { val sub = Sub::class - assertEquals(listOf("a", "c"), sub.properties.map { it.name }.sort()) - assertEquals(listOf("b", "d"), sub.extensionProperties.map { it.name }.sort()) - assertEquals(listOf("c"), sub.declaredProperties.map { it.name }) - assertEquals(listOf("d"), sub.declaredExtensionProperties.map { it.name }) + assertEquals(listOf("a", "c"), sub.memberProperties.map { it.name }.sort()) + assertEquals(listOf("b", "d"), sub.memberExtensionProperties.map { it.name }.sort()) + assertEquals(listOf("c"), sub.declaredMemberProperties.map { it.name }) + assertEquals(listOf("d"), sub.declaredMemberExtensionProperties.map { it.name }) return "OK" } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/callPrivatePropertyFromGetProperties.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/callPrivatePropertyFromGetProperties.kt index b11fc5e5dd8..186f66b5c6b 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/callPrivatePropertyFromGetProperties.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/callPrivatePropertyFromGetProperties.kt @@ -4,7 +4,7 @@ import kotlin.reflect.jvm.* class K(private val value: String) fun box(): String { - val p = javaClass().kotlin.properties.single() as KProperty1 + val p = javaClass().kotlin.memberProperties.single() as KProperty1 try { return p.get(K("Fail: private property should not be accessible by default")) diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/fakeOverridesInSubclass.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/fakeOverridesInSubclass.kt index 91d80e0db64..dc4e816b363 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/fakeOverridesInSubclass.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/fakeOverridesInSubclass.kt @@ -7,10 +7,10 @@ open class Super(val r: String) class Sub(r: String) : Super(r) fun box(): String { - val props = javaClass().kotlin.declaredProperties + val props = javaClass().kotlin.declaredMemberProperties if (!props.isEmpty()) return "Fail $props" - val allProps = javaClass().kotlin.properties + val allProps = javaClass().kotlin.memberProperties assertEquals(listOf("r"), allProps.map { it.name }) return allProps.single().get(Sub("OK")) as String } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/genericClassLiteralPropertyReceiverIsStar.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/genericClassLiteralPropertyReceiverIsStar.kt index 471038730e4..18c0b2b52d7 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/genericClassLiteralPropertyReceiverIsStar.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/genericClassLiteralPropertyReceiverIsStar.kt @@ -5,6 +5,6 @@ class A { } fun box(): String { - val k: KProperty1, *> = A::class.properties.single() + val k: KProperty1, *> = A::class.memberProperties.single() return k.get(A()) as String } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/getExtensionPropertiesMutableVsReadonly.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/getExtensionPropertiesMutableVsReadonly.kt index 6e48a9e9a63..f581d9140a1 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/getExtensionPropertiesMutableVsReadonly.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/getExtensionPropertiesMutableVsReadonly.kt @@ -13,7 +13,7 @@ class A { } fun box(): String { - val props = javaClass().kotlin.extensionProperties + val props = javaClass().kotlin.memberExtensionProperties val readonly = props.single { it.name == "readonly" } assert(readonly !is KMutableProperty2) { "Fail 1: $readonly" } val mutable = props.single { it.name == "mutable" } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/getPropertiesMutableVsReadonly.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/getPropertiesMutableVsReadonly.kt index 44fcc55c210..357294d3914 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/getPropertiesMutableVsReadonly.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/getPropertiesMutableVsReadonly.kt @@ -6,7 +6,7 @@ class A(val readonly: String) { } fun box(): String { - val props = javaClass().kotlin.properties + val props = javaClass().kotlin.memberProperties val readonly = props.single { it.name == "readonly" } assert(readonly !is KMutableProperty1) { "Fail 1: $readonly" } val mutable = props.single { it.name == "mutable" } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/memberAndMemberExtensionWithSameName.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/memberAndMemberExtensionWithSameName.kt index c888f6f8d80..bfdb9871187 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/memberAndMemberExtensionWithSameName.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/memberAndMemberExtensionWithSameName.kt @@ -8,13 +8,13 @@ class A { fun box(): String { run { - val foo: KProperty1 = javaClass().kotlin.properties.single() + val foo: KProperty1 = javaClass().kotlin.memberProperties.single() assert(foo.name == "foo") { "Fail name: $foo (${foo.name})" } assert(foo.get(A()) == "member") { "Fail value: ${foo[A()]}" } } run { - val foo: KProperty2 = javaClass().kotlin.extensionProperties.single() + val foo: KProperty2 = javaClass().kotlin.memberExtensionProperties.single() assert(foo.name == "foo") { "Fail name: $foo (${foo.name})" } foo as KProperty2 assert(foo.get(A(), Unit) == "extension") { "Fail value: ${foo[A(), Unit]}" } diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVal.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVal.kt index 59d307a73be..ba7009782bb 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVal.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVal.kt @@ -4,7 +4,7 @@ import kotlin.reflect.jvm.accessible class Result { private val value = "OK" - fun ref() = Result::class.properties.single() as KProperty1 + fun ref() = Result::class.memberProperties.single() as KProperty1 } fun box(): String { diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVar.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVar.kt index accd3c6f4cd..3762d26cd52 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVar.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateClassVar.kt @@ -4,7 +4,7 @@ import kotlin.reflect.jvm.accessible class A { private var value = 0 - fun ref() = A::class.properties.single() as KMutableProperty1 + fun ref() = A::class.memberProperties.single() as KMutableProperty1 } fun box(): String { diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateFakeOverrideFromSuperclass.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateFakeOverrideFromSuperclass.kt index a0319b42cf3..3cf71da4021 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateFakeOverrideFromSuperclass.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/privateFakeOverrideFromSuperclass.kt @@ -4,5 +4,5 @@ open class A(private val p: Int) class B : A(42) fun box() = - if (B::class.properties.isEmpty()) "OK" - else "Fail: invisible fake overrides should not appear in KClass.properties" + if (B::class.memberProperties.isEmpty()) "OK" + else "Fail: invisible fake overrides should not appear in KClass.memberProperties" diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/protectedClassVar.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/protectedClassVar.kt index 486b5c9f8b5..cbf8856c6eb 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/protectedClassVar.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/protectedClassVar.kt @@ -4,7 +4,7 @@ import kotlin.reflect.jvm.accessible class A(param: String) { protected var v: String = param - fun ref() = A::class.properties.single() as KMutableProperty1 + fun ref() = A::class.memberProperties.single() as KMutableProperty1 } fun box(): String { diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/properties/simpleGetProperties.kt b/compiler/testData/codegen/boxWithStdlib/reflection/properties/simpleGetProperties.kt index 86d25740c52..cfded82a949 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/properties/simpleGetProperties.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/properties/simpleGetProperties.kt @@ -14,7 +14,7 @@ class A(param: String) { fun box(): String { val klass = javaClass().kotlin - val props = klass.properties + val props = klass.memberProperties val names = props.map { it.name }.toSortedList() assert(names == listOf("anyVar", "int", "string")) { "Fail names: $props" } diff --git a/compiler/testData/codegen/reflection/classLoaders/differentClassLoaders.kt b/compiler/testData/codegen/reflection/classLoaders/differentClassLoaders.kt index 83e8f285ded..6780fe3f7d4 100644 --- a/compiler/testData/codegen/reflection/classLoaders/differentClassLoaders.kt +++ b/compiler/testData/codegen/reflection/classLoaders/differentClassLoaders.kt @@ -15,8 +15,8 @@ class Test { assertNotEquals(k1, k2) // The same for properties of these classes - val p1 = k1.properties.first() - val p2 = k2.properties.first() + val p1 = k1.memberProperties.first() + val p2 = k2.memberProperties.first() assertEquals("$p1", "$p2") assertNotEquals(p1, p2) } diff --git a/core/reflection.jvm/src/kotlin/reflect/KClassExtensions.kt b/core/reflection.jvm/src/kotlin/reflect/KClassExtensions.kt index 9936dc6391b..3fe2a57ff52 100644 --- a/core/reflection.jvm/src/kotlin/reflect/KClassExtensions.kt +++ b/core/reflection.jvm/src/kotlin/reflect/KClassExtensions.kt @@ -43,7 +43,7 @@ public val KClass<*>.declaredFunctions: Collection> /** * Returns non-extension properties declared in this class and all of its superclasses. */ -public val KClass.properties: Collection> +public val KClass.memberProperties: Collection> get() = (this as KClassImpl) .getMembers(declaredOnly = false, nonExtensions = true, extensions = false) .filterIsInstance>() @@ -52,7 +52,7 @@ public val KClass.properties: Collection> /** * Returns extension properties declared in this class and all of its superclasses. */ -public val KClass.extensionProperties: Collection> +public val KClass.memberExtensionProperties: Collection> get() = (this as KClassImpl) .getMembers(declaredOnly = false, nonExtensions = false, extensions = true) .filterIsInstance>() @@ -61,7 +61,7 @@ public val KClass.extensionProperties: Collection> /** * Returns non-extension properties declared in this class. */ -public val KClass.declaredProperties: Collection> +public val KClass.declaredMemberProperties: Collection> get() = (this as KClassImpl) .getMembers(declaredOnly = true, nonExtensions = true, extensions = false) .filterIsInstance>() @@ -70,7 +70,7 @@ public val KClass.declaredProperties: Collection> /** * Returns extension properties declared in this class. */ -public val KClass.declaredExtensionProperties: Collection> +public val KClass.declaredMemberExtensionProperties: Collection> get() = (this as KClassImpl) .getMembers(declaredOnly = true, nonExtensions = false, extensions = true) .filterIsInstance>() diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/_Deprecated.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/_Deprecated.kt index f5ee6997867..6a8ebd5bf43 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/_Deprecated.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/_Deprecated.kt @@ -17,8 +17,25 @@ package kotlin.reflect.jvm import java.lang.reflect.Field -import kotlin.reflect.KProperty +import kotlin.reflect.* @deprecated("Use kotlinProperty instead.", ReplaceWith("kotlinProperty")) public val Field.kotlin: KProperty<*>? get() = kotlinProperty + + +@deprecated("Use memberProperties instead.", ReplaceWith("memberProperties")) +public val KClass.properties: Collection> + get() = memberProperties + +@deprecated("Use extensionProperties instead.", ReplaceWith("extensionProperties")) +public val KClass.extensionProperties: Collection> + get() = memberExtensionProperties + +@deprecated("Use declaredMemberProperties instead.", ReplaceWith("declaredMemberProperties")) +public val KClass.declaredProperties: Collection> + get() = declaredMemberProperties + +@deprecated("Use declaredMemberExtensionProperties instead.", ReplaceWith("declaredMemberExtensionProperties")) +public val KClass.declaredExtensionProperties: Collection> + get() = declaredMemberExtensionProperties diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt index 25eb3d870e5..28d77561159 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt @@ -111,7 +111,7 @@ public val Field.kotlinProperty: KProperty<*>? // TODO: fields in package parts // TODO: optimize (search by name) - return getDeclaringClass().kotlin.properties.firstOrNull { it.javaField == this } + return getDeclaringClass().kotlin.memberProperties.firstOrNull { it.javaField == this } }