diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt index 0ba34319555..1d128061b3e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolNamesProvider.kt @@ -6,8 +6,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider -import org.jetbrains.kotlin.analysis.utils.collections.filterToSetOrEmpty -import org.jetbrains.kotlin.analysis.utils.collections.mapToSetOrEmpty import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProvider @@ -15,6 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirDelegatingCachedSymbolNames import org.jetbrains.kotlin.fir.resolve.providers.FirCachedSymbolNamesProvider import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.filterToSetOrEmpty /** * A [FirSymbolNamesProvider] that fetches top-level names from a Kotlin [declarationProvider]. diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt index 641e1d69e6d..d7302c3516e 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName +import org.jetbrains.kotlin.utils.mapToSetOrEmpty import java.nio.file.Path class PackagePartsCacheData( @@ -95,10 +96,7 @@ abstract class AbstractFirDeserializedSymbolProvider( override val symbolNamesProvider: FirSymbolNamesProvider = object : FirCachedSymbolNamesProvider(session) { override fun computeTopLevelClassifierNames(packageFqName: FqName): Set? { - val classesInPackage = knownTopLevelClassesInPackage(packageFqName) - ?.mapTo(mutableSetOf()) { Name.identifier(it) } - ?.ifEmpty { emptySet() } - ?: return null + val classesInPackage = knownTopLevelClassesInPackage(packageFqName)?.mapToSetOrEmpty { Name.identifier(it) } ?: return null if (packageFqName.asString() !in packageNamesForNonClassDeclarations) return classesInPackage diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 2aeaf964a44..7962fe9deb5 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.mapToSetOrEmpty // This symbol provider only loads JVM classes *not* annotated with Kotlin `@Metadata` annotation. // Use it in application sessions for loading classes from Java files listed on the command line. @@ -72,9 +73,7 @@ open class JavaSymbolProvider( override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProviderWithoutCallables() { override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set? = - javaFacade.knownClassNamesInPackage(packageFqName) - ?.mapTo(mutableSetOf()) { Name.identifier(it) } - ?.ifEmpty { emptySet() } + javaFacade.knownClassNamesInPackage(packageFqName)?.mapToSetOrEmpty { Name.identifier(it) } } } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirCachedSymbolNamesProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirCachedSymbolNamesProvider.kt index ba53ea37079..4a3fcf5d8f9 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirCachedSymbolNamesProvider.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirCachedSymbolNamesProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirSyntheticFunctionInter import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.flatMapToNullableSet /** * A [FirSymbolNamesProvider] that caches all name sets. @@ -102,9 +103,3 @@ open class FirCompositeCachedSymbolNamesProvider( create(session, providers.map { it.symbolNamesProvider }) } } - -/** - * Works almost as regular flatMap, but returns a set and returns null if any lambda call returned null - */ -inline fun Iterable.flatMapToNullableSet(transform: (T) -> Iterable?): Set? = - flatMapTo(mutableSetOf()) { transform(it) ?: return null } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolNamesProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolNamesProvider.kt index acc635f0e61..d79a896bf6a 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolNamesProvider.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolNamesProvider.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.flatMapToNullableSet /** * [FirSymbolNamesProvider] provides information about which symbols may be provided by a [FirSymbolProvider] given the symbol's name. This diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/collectionUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/setUtils.kt similarity index 60% rename from analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/collectionUtils.kt rename to compiler/util/src/org/jetbrains/kotlin/utils/setUtils.kt index 76797e97727..f4e9d383108 100644 --- a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/collectionUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/setUtils.kt @@ -3,7 +3,13 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.analysis.utils.collections +package org.jetbrains.kotlin.utils + +/** + * Works almost as regular flatMap, but returns a set and returns null if any lambda call returned null + */ +inline fun Iterable.flatMapToNullableSet(transform: (T) -> Iterable?): Set? = + flatMapTo(mutableSetOf()) { transform(it) ?: return null }.ifEmpty { emptySet() } /** * Maps all elements of this non-empty collection with the given [transform] function to a new mutable set, or returns [emptySet] if this @@ -12,8 +18,8 @@ package org.jetbrains.kotlin.analysis.utils.collections * [mapToSetOrEmpty] should be preferred over `collection.mapTo(mutableSetOf()) { ... }` when `collection` may be empty and the resulting * set may be cached, because [mapToSetOrEmpty] saves memory by avoiding the creation of an empty mutable set. */ -public inline fun Collection.mapToSetOrEmpty(transform: (T) -> R): Set = +inline fun Collection.mapToSetOrEmpty(transform: (T) -> R): Set = if (isNotEmpty()) mapTo(mutableSetOf(), transform) else emptySet() -public inline fun Collection.filterToSetOrEmpty(predicate: (T) -> Boolean): Set = +inline fun Collection.filterToSetOrEmpty(predicate: (T) -> Boolean): Set = filterTo(mutableSetOf(), predicate).ifEmpty { emptySet() }