diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt new file mode 100644 index 00000000000..51a055d1746 --- /dev/null +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.low.level.api.fir.project.structure + +import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform + +internal class CompositeKotlinPackageProvider +private constructor( + private val providers: List +) : KotlinPackageProvider() { + + override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { + return providers.any { it.doesPackageExist(packageFqName, platform) } + } + + override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean { + return providers.any { it.doesKotlinOnlyPackageExist(packageFqName) } + } + + override fun doesPlatformSpecificPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { + return providers.any { it.doesPlatformSpecificPackageExist(packageFqName, platform) } + } + + override fun getSubPackageFqNames(packageFqName: FqName, platform: TargetPlatform, nameFilter: (Name) -> Boolean): Set { + return providers.flatMapTo(mutableSetOf()) { it.getSubPackageFqNames(packageFqName, platform, nameFilter) } + } + + override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set { + return providers.flatMapTo(mutableSetOf()) { it.getKotlinOnlySubPackagesFqNames(packageFqName, nameFilter) } + } + + override fun getPlatformSpecificSubPackagesFqNames( + packageFqName: FqName, + platform: TargetPlatform, + nameFilter: (Name) -> Boolean + ): Set { + return providers.flatMapTo(mutableSetOf()) { it.getPlatformSpecificSubPackagesFqNames(packageFqName, platform, nameFilter) } + } + + companion object { + fun create(providers: List): KotlinPackageProvider { + return when (providers.size) { + 0 -> EmptyKotlinPackageProvider + 1 -> providers.single() + else -> CompositeKotlinPackageProvider(providers) + } + } + } +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt new file mode 100644 index 00000000000..3ec08a25b23 --- /dev/null +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.low.level.api.fir.project.structure + +import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform + +internal object EmptyKotlinPackageProvider : KotlinPackageProvider() { + override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { + return false + } + + override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean { + return false + } + + override fun doesPlatformSpecificPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { + return false + } + + override fun getSubPackageFqNames(packageFqName: FqName, platform: TargetPlatform, nameFilter: (Name) -> Boolean): Set { + return emptySet() + } + + override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set { + return emptySet() + } + + override fun getPlatformSpecificSubPackagesFqNames( + packageFqName: FqName, + platform: TargetPlatform, + nameFilter: (Name) -> Boolean + ): Set { + return emptySet() + } +}