diff --git a/core/reflection.jvm/src/kotlin/reflect/KClasses.kt b/core/reflection.jvm/src/kotlin/reflect/KClasses.kt index 2d8b15f1db4..da61d385112 100644 --- a/core/reflection.jvm/src/kotlin/reflect/KClasses.kt +++ b/core/reflection.jvm/src/kotlin/reflect/KClasses.kt @@ -15,6 +15,8 @@ */ @file:JvmName("KClasses") +@file:Suppress("UNCHECKED_CAST") + package kotlin.reflect import org.jetbrains.kotlin.descriptors.ConstructorDescriptor @@ -70,7 +72,7 @@ val KClass<*>.defaultType: KType * Does not include members declared in supertypes. */ val KClass<*>.declaredMembers: Collection> - get() = (this as KClassImpl).data().declaredMembers.toList() + get() = (this as KClassImpl).data().declaredMembers /** * Returns all functions declared in this class, including all non-static methods declared in the class @@ -83,27 +85,19 @@ val KClass<*>.functions: Collection> * Returns static functions declared in this class. */ val KClass<*>.staticFunctions: Collection> - get() = (this as KClassImpl).data().allStaticMembers - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allStaticMembers.filterIsInstance>() /** * Returns non-extension non-static functions declared in this class and all of its superclasses. */ val KClass<*>.memberFunctions: Collection> - get() = (this as KClassImpl).data().allNonStaticMembers - .filterNotExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allNonStaticMembers.filter { it.isNotExtension && it is KFunction<*> } as Collection> /** * Returns extension functions declared in this class and all of its superclasses. */ val KClass<*>.memberExtensionFunctions: Collection> - get() = (this as KClassImpl).data().allNonStaticMembers - .filterExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allNonStaticMembers.filter { it.isExtension && it is KFunction<*> } as Collection> /** * Returns all functions declared in this class. @@ -111,80 +105,57 @@ val KClass<*>.memberExtensionFunctions: Collection> * declared in the class and the superclasses, as well as static methods declared in the class. */ val KClass<*>.declaredFunctions: Collection> - get() = (this as KClassImpl).data().declaredMembers - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().declaredMembers.filterIsInstance>() /** * Returns non-extension non-static functions declared in this class. */ val KClass<*>.declaredMemberFunctions: Collection> - get() = (this as KClassImpl).data().declaredNonStaticMembers - .filterNotExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().declaredNonStaticMembers.filter { it.isNotExtension && it is KFunction<*> } as Collection> /** * Returns extension functions declared in this class. */ val KClass<*>.declaredMemberExtensionFunctions: Collection> - get() = (this as KClassImpl).data().declaredNonStaticMembers - .filterExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().declaredNonStaticMembers.filter { it.isExtension && it is KFunction<*> } as Collection> /** * Returns static properties declared in this class. * Only properties representing static fields of Java classes are considered static. */ val KClass<*>.staticProperties: Collection> - get() = (this as KClassImpl).data().allStaticMembers - .filterNotExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allStaticMembers.filter { it.isNotExtension && it is KProperty0<*> } as Collection> /** * Returns non-extension properties declared in this class and all of its superclasses. */ val KClass.memberProperties: Collection> - get() = (this as KClassImpl).data().allNonStaticMembers - .filterNotExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allNonStaticMembers.filter { it.isNotExtension && it is KProperty1<*, *> } as Collection> /** * Returns extension properties declared in this class and all of its superclasses. */ val KClass.memberExtensionProperties: Collection> - get() = (this as KClassImpl).data().allNonStaticMembers - .filterExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().allNonStaticMembers.filter { it.isExtension && it is KProperty2<*, *, *> } as Collection> /** * Returns non-extension properties declared in this class. */ val KClass.declaredMemberProperties: Collection> - get() = (this as KClassImpl).data().declaredNonStaticMembers - .filterNotExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().declaredNonStaticMembers.filter { it.isNotExtension && it is KProperty1<*, *> } as Collection> /** * Returns extension properties declared in this class. */ val KClass.declaredMemberExtensionProperties: Collection> - get() = (this as KClassImpl).data().declaredNonStaticMembers - .filterExtensions() - .filterIsInstance>() - .toList() + get() = (this as KClassImpl).data().declaredNonStaticMembers.filter { it.isExtension && it is KProperty2<*, *, *> } as Collection> -private fun > Sequence.filterExtensions(): Sequence = - filter { it.descriptor.extensionReceiverParameter != null } +private val KCallableImpl<*>.isExtension: Boolean + get() = descriptor.extensionReceiverParameter != null -private fun > Sequence.filterNotExtensions(): Sequence = - filter { it.descriptor.extensionReceiverParameter == null } +private val KCallableImpl<*>.isNotExtension: Boolean + get() = !isExtension /** * Immediate superclasses of this class, in the order they are listed in the source code. @@ -256,7 +227,6 @@ fun KClass<*>.isSuperclassOf(derived: KClass<*>): Boolean = * @see [KClass.isInstance] * @see [KClass.safeCast] */ -@Suppress("UNCHECKED_CAST") fun KClass.cast(value: Any?): T { if (!isInstance(value)) throw TypeCastException("Value cannot be cast to $qualifiedName") return value as T @@ -269,7 +239,6 @@ fun KClass.cast(value: Any?): T { * @see [KClass.isInstance] * @see [KClass.cast] */ -@Suppress("UNCHECKED_CAST") fun KClass.safeCast(value: Any?): T? { return if (isInstance(value)) value as T else null } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index f44ba6122a7..91b4e6d1810 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -134,22 +134,23 @@ internal class KClassImpl(override val jClass: Class) : KDeclaration } } - val declaredNonStaticMembers: Sequence> + val declaredNonStaticMembers: Collection> by ReflectProperties.lazySoft { getMembers(memberScope, DECLARED) } - val declaredStaticMembers: Sequence> + val declaredStaticMembers: Collection> by ReflectProperties.lazySoft { getMembers(staticScope, DECLARED) } - val inheritedNonStaticMembers: Sequence> + val inheritedNonStaticMembers: Collection> by ReflectProperties.lazySoft { getMembers(memberScope, INHERITED) } - val inheritedStaticMembers: Sequence> + val inheritedStaticMembers: Collection> by ReflectProperties.lazySoft { getMembers(staticScope, INHERITED) } - val allNonStaticMembers: Sequence> get() = declaredNonStaticMembers + inheritedNonStaticMembers - val allStaticMembers: Sequence> get() = declaredStaticMembers + inheritedStaticMembers - val declaredMembers: Sequence> get() = declaredNonStaticMembers + declaredStaticMembers - - val allMembers: Collection> by ReflectProperties.lazySoft { - (allNonStaticMembers + allStaticMembers).toList() - } + val allNonStaticMembers: Collection> + by ReflectProperties.lazySoft { declaredNonStaticMembers + inheritedNonStaticMembers } + val allStaticMembers: Collection> + by ReflectProperties.lazySoft { declaredStaticMembers + inheritedStaticMembers } + val declaredMembers: Collection> + by ReflectProperties.lazySoft { declaredNonStaticMembers + declaredStaticMembers } + val allMembers: Collection> + by ReflectProperties.lazySoft { allNonStaticMembers + allStaticMembers } } val data = ReflectProperties.lazy { Data() } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt index 896a714632b..7b3b9be36c0 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.load.java.structure.reflect.safeClassLoader import org.jetbrains.kotlin.load.kotlin.reflect.RuntimeModuleData import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.utils.toReadOnlyList import java.lang.reflect.Constructor import java.lang.reflect.Method import java.util.* @@ -47,7 +48,7 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain abstract fun getFunctions(name: Name): Collection - protected fun getMembers(scope: MemberScope, belonginess: MemberBelonginess): Sequence> { + protected fun getMembers(scope: MemberScope, belonginess: MemberBelonginess): Collection> { val visitor = object : DeclarationDescriptorVisitorEmptyBodies, Unit>() { override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit): KCallableImpl<*> = createProperty(descriptor) @@ -59,15 +60,13 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain throw IllegalStateException("No constructors should appear in this scope: $descriptor") } - return scope.getContributedDescriptors().asSequence() - .filter { descriptor -> - descriptor is CallableMemberDescriptor && - descriptor.visibility != Visibilities.INVISIBLE_FAKE && - belonginess.accept(descriptor) - } - .mapNotNull { descriptor -> - descriptor.accept(visitor, Unit) - } + return scope.getContributedDescriptors().mapNotNull { descriptor -> + if (descriptor is CallableMemberDescriptor && + descriptor.visibility != Visibilities.INVISIBLE_FAKE && + belonginess.accept(descriptor)) + descriptor.accept(visitor, Unit) + else null + }.toReadOnlyList() } protected enum class MemberBelonginess { diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt index c8d597c5c34..7c514b8fcdd 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -56,7 +56,7 @@ internal class KPackageImpl(override val jClass: Class<*>, val moduleName: Strin val packageFragment = callableDescriptor.containingDeclaration as PackageFragmentDescriptor val source = (packageFragment as? LazyJavaPackageFragment)?.source as? KotlinJvmBinaryPackageSourceElement (source?.getContainingBinaryClass(callableDescriptor) as? ReflectKotlinClass)?.klass == jClass - }.toList() + } } }