diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index 30dfcd78e0b..c151943d888 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProv import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.getValue @@ -60,36 +61,58 @@ open class LazyClassMemberScope( ) { private val allDescriptors = storageManager.createLazyValue { + doDescriptors(ALL_NAME_FILTER) + } + + private fun doDescriptors(nameFilter: (Name) -> Boolean): List { val result = LinkedHashSet( computeDescriptorsFromDeclaredElements( DescriptorKindFilter.ALL, - MemberScope.ALL_NAME_FILTER, + nameFilter, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS ) ) result.addAll(computeExtraDescriptors(NoLookupLocation.FOR_ALREADY_TRACKED)) - result.toList() + return result.toList() } private val allClassifierDescriptors = storageManager.createLazyValue { + doClassifierDescriptors(ALL_NAME_FILTER) + } + + private fun doClassifierDescriptors(nameFilter: (Name) -> Boolean): List { val result = LinkedHashSet( computeDescriptorsFromDeclaredElements( DescriptorKindFilter.CLASSIFIERS, - MemberScope.ALL_NAME_FILTER, + nameFilter, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS ) ) addSyntheticCompanionObject(result, NoLookupLocation.FOR_ALREADY_TRACKED) addSyntheticNestedClasses(result, NoLookupLocation.FOR_ALREADY_TRACKED) - result.toList() + return result.toList() } override fun getContributedDescriptors( kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean ): Collection = when (kindFilter) { - DescriptorKindFilter.CLASSIFIERS -> allClassifierDescriptors() - else -> allDescriptors() + DescriptorKindFilter.CLASSIFIERS -> + if (nameFilter == ALL_NAME_FILTER || allClassifierDescriptors.isComputed() || allClassifierDescriptors.isComputing()) { + allClassifierDescriptors() + } else { + storageManager.compute { + doClassifierDescriptors(nameFilter) + } + } + else -> + if (nameFilter == ALL_NAME_FILTER || allDescriptors.isComputed() || allDescriptors.isComputing()) { + allDescriptors() + } else { + storageManager.compute { + doDescriptors(nameFilter) + } + } } protected open fun computeExtraDescriptors(location: LookupLocation): Collection { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt index 3bc4e41cb33..3cc3e1b9811 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.scopes import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.lang.reflect.Modifier @@ -73,7 +74,7 @@ fun Iterable.flatMapClassifierNamesOrNull(): MutableSet? = */ fun MemberScope.getDescriptorsFiltered( kindFilter: DescriptorKindFilter = DescriptorKindFilter.ALL, - nameFilter: (Name) -> Boolean = { true } + nameFilter: (Name) -> Boolean = ALL_NAME_FILTER ): Collection { if (kindFilter.kindMask == 0) return listOf() return getContributedDescriptors(kindFilter, nameFilter).filter { kindFilter.accepts(it) && nameFilter(it.name) }