diff --git a/core/reflection.jvm/src/kotlin/reflect/KDeclarationContainerExtensions.kt b/core/reflection.jvm/src/kotlin/reflect/KDeclarationContainerExtensions.kt index ff2b170d8b0..d0418500836 100644 --- a/core/reflection.jvm/src/kotlin/reflect/KDeclarationContainerExtensions.kt +++ b/core/reflection.jvm/src/kotlin/reflect/KDeclarationContainerExtensions.kt @@ -23,3 +23,6 @@ package kotlin.reflect */ public val KDeclarationContainer.functions: Collection> get() = members.filterIsInstance>() + +public val KDeclarationContainer.properties: Collection> + get() = members.filterIsInstance>() diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt index 45e0e2404b4..8d49af45411 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt @@ -87,12 +87,25 @@ public val Field.kotlinProperty: KProperty<*>? get() { if (isSynthetic()) return null - // TODO: fields in package parts // TODO: optimize (search by name) + + val kotlinPackage = getKPackage() + if (kotlinPackage != null) { + return kotlinPackage.members.filterIsInstance>().firstOrNull { it.javaField == this } + } + return getDeclaringClass().kotlin.memberProperties.firstOrNull { it.javaField == this } } +private fun Member.getKPackage(): KDeclarationContainer? { + // TODO: support multifile classes + val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java) + return if (fileFacade != null) + Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName) + else null +} + /** * Returns a [KFunction] instance corresponding to the given Java [Method] instance, * or `null` if this method cannot be represented by a Kotlin function @@ -103,11 +116,8 @@ public val Method.kotlinFunction: KFunction<*>? if (isSynthetic) return null if (Modifier.isStatic(modifiers)) { - // TODO: support multifile classes - - val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java) - if (fileFacade != null) { - val kotlinPackage = Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName) + val kotlinPackage = getKPackage() + if (kotlinPackage != null) { return kotlinPackage.functions.firstOrNull { it.javaMethod == this } }