diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt index b0105d81ac9..af5ef0f6afd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt @@ -384,7 +384,7 @@ internal open class SharedNativeCompilationDetails( override val friendArtifacts: FileCollection get() = super.friendArtifacts.plus(run { val project = target.project - val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(project, defaultSourceSet).toMutableSet().apply { + val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(defaultSourceSet).toMutableSet().apply { // TODO: implement proper dependsOn/refines compiler args for Kotlin/Native and pass the dependsOn klibs separately; // But for now, those dependencies don't have any special semantics, so passing all them as friends works, too addAll(defaultSourceSet.internal.dependsOnClosure) @@ -564,7 +564,7 @@ internal class MetadataCompilationDetails(target: KotlinTarget, name: String) : override val friendArtifacts: FileCollection get() = super.friendArtifacts.plus(run { val project = target.project - val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(target.project, defaultSourceSet) + val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(defaultSourceSet) project.files(friendSourceSets.mapNotNull { target.compilations.findByName(it.name)?.output?.classesDirs }) }) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt index 24a406a1adc..4a5af1d33f1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt @@ -131,7 +131,6 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp val extension = project.multiplatformExtensionOrNull ?: project.kotlinExtension - ?: return emptyList() val targets = when (extension) { is KotlinMultiplatformExtension -> extension.targets.filter { it.name != KotlinMultiplatformPlugin.METADATA_TARGET_NAME } @@ -219,7 +218,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp if (addInferredSourceSetVisibilityAsExplicit) { project.kotlinExtension.sourceSets.forEach { sourceSet -> val fragment = fragmentByName(sourceSet.name) - getVisibleSourceSetsFromAssociateCompilations(project, sourceSet).forEach { dependency -> + getVisibleSourceSetsFromAssociateCompilations(sourceSet).forEach { dependency -> val dependencyFragment = fragmentByName(dependency.name) fragment.declaredModuleDependencies.add(KpmModuleDependency(dependencyFragment.containingModule.moduleIdentifier)) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index dec55697e09..e2d71a4b4e3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -368,7 +368,7 @@ internal fun requestedDependencies( project.configurations.sourceSetDependencyConfigurationByScope(sourceSet, scope).incoming.dependencies } - val otherContributingSourceSets = dependsOnClosureWithInterCompilationDependencies(project, sourceSet) + val otherContributingSourceSets = dependsOnClosureWithInterCompilationDependencies(sourceSet) return listOf(sourceSet, *otherContributingSourceSets.toTypedArray()).flatMap(::collectScopedDependenciesFromSourceSet) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 36f167f1f37..08d3eee2531 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.SourceSetMetadataStorageForIde import org.jetbrains.kotlin.gradle.plugin.sources.checkSourceSetVisibilityRequirements +import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset @@ -115,8 +116,8 @@ class KotlinMultiplatformPlugin : Plugin { project.multiplatformExtension.metadata().compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) val primaryCompilationsBySourceSet by lazy { // don't evaluate eagerly: Android targets are not created at this point - val allCompilationsForSourceSets = CompilationSourceSetUtil.compilationsBySourceSets(project).mapValues { (_, compilations) -> - compilations.filter { it.target.platformType != KotlinPlatformType.common } + val allCompilationsForSourceSets = project.multiplatformExtension.sourceSets.associateWith { sourceSet -> + sourceSet.internal.compilations.filter { compilation -> compilation.target.platformType != KotlinPlatformType.common } } allCompilationsForSourceSets.mapValues { (_, compilations) -> // choose one primary compilation @@ -347,14 +348,14 @@ internal fun sourcesJarTaskNamed( internal fun Project.setupGeneralKotlinExtensionParameters() { val sourceSetsInMainCompilation by lazy { - CompilationSourceSetUtil.compilationsBySourceSets(project).filterValues { compilations -> - compilations.any { + kotlinExtension.sourceSets.filter { sourceSet -> + sourceSet.internal.compilations.any { // kotlin main compilation it.isMain() // android compilation which is NOT in tested variant || (it as? KotlinJvmAndroidCompilation)?.let { getTestedVariantData(it.androidVariant) == null } == true } - }.keys + } } kotlinExtension.sourceSets.all { sourceSet -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index a355c5ff7d5..09c8dab99a6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -168,14 +168,14 @@ private fun buildKotlinProjectStructureMetadata(extension: KotlinMultiplatformEx * published as API dependencies of the metadata module to get into the resolution result, see * [KotlinMetadataTargetConfigurator.exportDependenciesForPublishing]. */ - val isNativeSharedSourceSet = isSharedNativeSourceSet(project, sourceSet) + val isNativeSharedSourceSet = isSharedNativeSourceSet(sourceSet) val scopes = listOfNotNull( KotlinDependencyScope.API_SCOPE, KotlinDependencyScope.IMPLEMENTATION_SCOPE.takeIf { isNativeSharedSourceSet } ) val sourceSetsToIncludeDependencies = if (isNativeSharedSourceSet) - dependsOnClosureWithInterCompilationDependencies(project, sourceSet).plus(sourceSet) + dependsOnClosureWithInterCompilationDependencies(sourceSet).plus(sourceSet) else listOf(sourceSet) val sourceSetExportedDependencies = scopes.flatMap { scope -> sourceSetsToIncludeDependencies.flatMap { hierarchySourceSet -> @@ -185,7 +185,7 @@ private fun buildKotlinProjectStructureMetadata(extension: KotlinMultiplatformEx sourceSet.name to sourceSetExportedDependencies.map { ModuleIds.fromDependency(it) }.toSet() }, sourceSetCInteropMetadataDirectory = sourceSetsWithMetadataCompilations.keys - .filter { isSharedNativeSourceSet(project, it) } + .filter { isSharedNativeSourceSet(it) } .associate { sourceSet -> sourceSet.name to cinteropMetadataDirectoryPath(sourceSet.name) }, hostSpecificSourceSets = getHostSpecificSourceSets(project) .filter { it in sourceSetsWithMetadataCompilations }.map { it.name } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt index bf345a75ca1..dc8f2501da8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope +import org.jetbrains.kotlin.gradle.plugin.sources.internal import java.io.File internal data class SourceSetVisibilityResult( @@ -54,7 +55,7 @@ internal class SourceSetVisibilityProvider( dependencyProjectStructureMetadata: KotlinProjectStructureMetadata, resolvedToOtherProject: Project? ): SourceSetVisibilityResult { - val compilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(visibleFrom) + val compilations = visibleFrom.internal.compilations val component = resolvedRootMppDependency ?: resolvedMetadataDependency val mppModuleIdentifier = component.toSingleKpmModuleIdentifier() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt index ad052ad2562..8792f11a585 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt @@ -58,19 +58,13 @@ open class TransformKotlinGranularMetadata @Suppress("unused") // Gradle input @get:Input internal val inputSourceSetsAndCompilations: Map> by project.provider { - val sourceSets = participatingSourceSets - CompilationSourceSetUtil.compilationsBySourceSets(project) - .filterKeys { it in sourceSets } - .entries.associate { (sourceSet, compilations) -> - sourceSet.name to compilations.map { it.name }.sorted() - } + participatingSourceSets.associate { sourceSet -> + sourceSet.name to sourceSet.internal.compilations.map { it.name }.sorted() + } } private val participatingCompilations: Iterable> - get() { - val sourceSets = participatingSourceSets - return CompilationSourceSetUtil.compilationsBySourceSets(project).filterKeys { it in sourceSets }.values.flatten() - } + get() = participatingSourceSets.flatMap { it.internal.compilations }.toSet() @Suppress("unused") // Gradle input @get:Input @@ -89,7 +83,7 @@ open class TransformKotlinGranularMetadata kotlinSourceSet, listOf(API_SCOPE, IMPLEMENTATION_SCOPE, COMPILE_ONLY_SCOPE), lazy { - dependsOnClosureWithInterCompilationDependencies(project, kotlinSourceSet).map { + dependsOnClosureWithInterCompilationDependencies(kotlinSourceSet).map { project.tasks.withType(TransformKotlinGranularMetadata::class.java) .getByName(KotlinMetadataTargetConfigurator.transformGranularMetadataTaskName(it.name)) .transformation diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UnusedSourceSetsChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UnusedSourceSetsChecker.kt index 5959b378c26..6b918335d7d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UnusedSourceSetsChecker.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UnusedSourceSetsChecker.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull +import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.whenEvaluated object UnusedSourceSetsChecker { @@ -39,11 +40,10 @@ object UnusedSourceSetsChecker { fun checkSourceSets(project: Project) { project.whenEvaluated { - val compilationsBySourceSet = CompilationSourceSetUtil.compilationsBySourceSets(project) val unusedSourceSets = project.kotlinExtension.sourceSets // Ignoring Android source sets .filter { it.androidSourceSetInfoOrNull == null } - .filter { compilationsBySourceSet[it]?.isEmpty() ?: true } + .filter { it.internal.compilations.isEmpty() } if (unusedSourceSets.isNotEmpty()) { reportUnusedSourceSets(project, unusedSourceSets.toSet()) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 5d868c9de81..79a4e1fb968 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -86,75 +86,6 @@ internal fun KotlinCompilation<*>.disambiguateName(simpleName: String): String { ) } -private typealias CompilationsBySourceSet = Map>> - -internal object CompilationSourceSetUtil { - private const val EXT_NAME = "kotlin.compilations.bySourceSets" - - @Suppress("UNCHECKED_CAST") - private fun getOrCreateProperty( - project: Project, - initialize: Property.() -> Unit - ): Property { - val ext = project.extensions.getByType(ExtraPropertiesExtension::class.java) - if (!ext.has(EXT_NAME)) { - ext.set(EXT_NAME, project.objects.property(Any::class.java as Class).also(initialize)) - } - return ext.get(EXT_NAME) as Property - } - - // FIXME: the results include the compilations of the metadata target; the callers should care about filtering them out - // if they need only the platform compilations - // TODO: create a separate util function: `platformCompilationsBySourceSets` - // TODO: visit all call sites, check if they handle the metadata compilations correctly - fun compilationsBySourceSets(project: Project): CompilationsBySourceSet { - val compilationNamesBySourceSetName = getOrCreateProperty(project) { - var shouldFinalizeValue = false - - set(project.provider { - val kotlinExtension = project.kotlinExtension - val targets = when (kotlinExtension) { - is KotlinMultiplatformExtension -> kotlinExtension.targets - is KotlinSingleTargetExtension<*> -> listOf(kotlinExtension.target) - else -> emptyList() - } - - val compilations = targets.flatMap { it.compilations } - - val result = mutableMapOf>>().apply { - compilations.forEach { compilation -> - compilation.allKotlinSourceSets.forEach { sourceSet -> - getOrPut(sourceSet) { mutableSetOf() }.add(compilation) - } - } - kotlinExtension.sourceSets.forEach { sourceSet -> - // For source sets not taking part in any compilation, keep an empty set to avoid errors on access by key - getOrPut(sourceSet) { mutableSetOf() } - } - } - - if (shouldFinalizeValue) { - set(result) - } - - return@provider result - }) - - project.gradle.taskGraph.whenReady { shouldFinalizeValue = true } - - // In case the value is first queried after the task graph has been calculated, finalize the value as soon as a task executes: - object : TaskExecutionListener { - override fun beforeExecute(task: Task) = Unit - override fun afterExecute(task: Task, state: TaskState) { - shouldFinalizeValue = true - } - } - } - - return compilationNamesBySourceSetName.get() - } -} - private val invalidModuleNameCharactersRegex = """[\\/\r\n\t]""".toRegex() internal fun filterModuleName(moduleName: String): String = diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index 739887e144e..f5c65b35815 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -148,8 +148,7 @@ abstract class DefaultKotlinSourceSet @Inject constructor( return getDependenciesTransformation(scope) } - fun getAdditionalVisibleSourceSets(): List = - getVisibleSourceSetsFromAssociateCompilations(project, this) + fun getAdditionalVisibleSourceSets(): List = getVisibleSourceSetsFromAssociateCompilations(this) internal fun getDependenciesTransformation(scope: KotlinDependencyScope): Iterable { val metadataDependencyResolutionByModule = diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt index 7423824cc4a..50500b03ae1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt @@ -10,18 +10,14 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure fun getSourceSetsFromAssociatedCompilations(fromCompilation: KotlinCompilation<*>): Map, Set> = fromCompilation.associateWithClosure.associate { it to it.allKotlinSourceSets } fun getVisibleSourceSetsFromAssociateCompilations( - project: Project, sourceSet: KotlinSourceSet -): List = getVisibleSourceSetsFromAssociateCompilations( - CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(sourceSet) -) +): List = getVisibleSourceSetsFromAssociateCompilations(sourceSet.internal.compilations) internal fun getVisibleSourceSetsFromAssociateCompilations( participatesInCompilations: Set> @@ -124,26 +120,22 @@ class UnsatisfiedSourceSetVisibilityException( } } -fun checkSourceSetVisibilityRequirements( - project: Project -) = checkSourceSetVisibilityRequirements( - project.kotlinExtension.sourceSets, - CompilationSourceSetUtil.compilationsBySourceSets(project) +fun checkSourceSetVisibilityRequirements(project: Project) = checkSourceSetVisibilityRequirements( + project.kotlinExtension.sourceSets ) internal fun checkSourceSetVisibilityRequirements( sourceSets: Iterable, - compilationsBySourceSet: Map>> ) { sourceSets.forEach { sourceSet -> val requiredVisibility = sourceSet.requiresVisibilityOf val inferredVisibility = - getVisibleSourceSetsFromAssociateCompilations(compilationsBySourceSet[sourceSet].orEmpty()) + getVisibleSourceSetsFromAssociateCompilations(sourceSet.internal.compilations) val requiredButNotVisible = requiredVisibility - inferredVisibility - sourceSet.internal.withDependsOnClosure if (requiredButNotVisible.isNotEmpty()) { - val compilations = compilationsBySourceSet.getValue(sourceSet) + val compilations = sourceSet.internal.compilations throw UnsatisfiedSourceSetVisibilityException( sourceSet, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 8b731f4f7f3..92cb493373d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -20,7 +20,6 @@ import org.gradle.api.tasks.bundling.Zip import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.sources.* @@ -189,7 +188,7 @@ class KotlinMetadataTargetConfigurator : createMetadataCompilation(target, sourceSet, allMetadataJar, sourceSet in hostSpecificSourceSets) } .onEach { (sourceSet, compilation) -> - if (!isMetadataCompilationSupported(target.project, sourceSet)) { + if (!isMetadataCompilationSupported(sourceSet)) { compilation.compileKotlinTaskProvider.configure { it.enabled = false } } } @@ -204,8 +203,8 @@ class KotlinMetadataTargetConfigurator : } } - private fun isMetadataCompilationSupported(project: Project, sourceSet: KotlinSourceSet): Boolean { - val platforms = compilationsBySourceSets(project)[sourceSet].orEmpty() + private fun isMetadataCompilationSupported(sourceSet: KotlinSourceSet): Boolean { + val platforms = sourceSet.internal.compilations .filter { it.target !is KotlinMetadataTarget } .map { it.target.platformType }.distinct() @@ -300,10 +299,10 @@ class KotlinMetadataTargetConfigurator : val compilationName = sourceSet.name - val platformCompilations = compilationsBySourceSets(project) - .getValue(sourceSet).filter { it.target.name != KotlinMultiplatformPlugin.METADATA_TARGET_NAME } + val platformCompilations = sourceSet.internal.compilations + .filter { it.target.name != KotlinMultiplatformPlugin.METADATA_TARGET_NAME } - val isNativeSourceSet = isSharedNativeSourceSet(project, sourceSet) + val isNativeSourceSet = isSharedNativeSourceSet(sourceSet) val compilationFactory: KotlinCompilationFactory> = when { isNativeSourceSet -> KotlinSharedNativeCompilationFactory( @@ -368,7 +367,7 @@ class KotlinMetadataTargetConfigurator : sourceSet, listOf(scope), lazy { - dependsOnClosureWithInterCompilationDependencies(project, sourceSet).filterIsInstance() + dependsOnClosureWithInterCompilationDependencies(sourceSet).filterIsInstance() .map { checkNotNull(it.dependencyTransformations[scope]) } } ) @@ -566,16 +565,17 @@ internal fun createMetadataDependencyTransformationClasspath( ) } -internal fun isSharedNativeSourceSet(project: Project, sourceSet: KotlinSourceSet): Boolean { - val compilations = compilationsBySourceSets(project)[sourceSet].orEmpty() +internal fun isSharedNativeSourceSet(sourceSet: KotlinSourceSet): Boolean { + val compilations = sourceSet.internal.compilations return compilations.isNotEmpty() && compilations.all { it.platformType == KotlinPlatformType.common || it.platformType == KotlinPlatformType.native } } -internal fun dependsOnClosureWithInterCompilationDependencies(project: Project, sourceSet: KotlinSourceSet): Set = +internal fun dependsOnClosureWithInterCompilationDependencies(sourceSet: KotlinSourceSet): Set = sourceSet.internal.dependsOnClosure.toMutableSet().apply { - addAll(getVisibleSourceSetsFromAssociateCompilations(project, sourceSet)) + addAll(getVisibleSourceSetsFromAssociateCompilations(sourceSet)) + } /** @@ -588,7 +588,7 @@ internal fun getCommonSourceSetsForMetadataCompilation(project: Project): Set>> = - compilationsBySourceSets(project) + project.kotlinExtension.sourceSets.associateWith { it.internal.compilations } val sourceSetsUsedInMultipleTargets = compilationsBySourceSet.filterValues { compilations -> compilations.map { it.target.platformType }.distinct().run { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt index d54e76adb90..5325762c0fc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.isNativeShared import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.variantsContainingFragment +import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.targets.metadata.* import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled @@ -175,18 +176,14 @@ internal fun getHostSpecificFragments( ) internal fun getHostSpecificSourceSets(project: Project): Set { - val compilationsBySourceSet = CompilationSourceSetUtil.compilationsBySourceSets(project).mapValues { (_, compilations) -> - compilations.filter { it !is KotlinMetadataCompilation<*> } - } - return getHostSpecificElements( project.kotlinExtension.sourceSets, isNativeShared = { sourceSet -> - val compilations = compilationsBySourceSet[sourceSet].orEmpty() + val compilations = sourceSet.internal.compilations compilations.isNotEmpty() && compilations.all { it.platformType == KotlinPlatformType.native } }, getKonanTargets = { sourceSet -> - compilationsBySourceSet[sourceSet].orEmpty() + sourceSet.internal.compilations .filterIsInstance() .mapTo(mutableSetOf()) { it.konanTarget } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt index 88a8738589f..c8541242b9a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt @@ -8,10 +8,10 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.Project import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure +import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropIdentifier.Scope import org.jetbrains.kotlin.tooling.core.UnsafeApi @@ -83,7 +83,7 @@ internal fun CInteropCommonizerDependent.Factory.from(compilation: KotlinSharedN internal fun CInteropCommonizerDependent.Factory.from(project: Project, sourceSet: KotlinSourceSet): CInteropCommonizerDependent? { return from( target = project.getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return null, - compilations = (compilationsBySourceSets(project)[sourceSet] ?: return null) + compilations = sourceSet.internal.compilations .filterIsInstance().toSet() ) } @@ -93,7 +93,7 @@ internal fun CInteropCommonizerDependent.Factory.fromAssociateCompilations( ): CInteropCommonizerDependent? { return from( target = project.getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return null, - compilations = (compilationsBySourceSets(project)[sourceSet] ?: return null) + compilations = sourceSet.internal.compilations .filterIsInstance() .flatMap { compilation -> compilation.associateWithClosure } .filterIsInstance() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt index 4af64a9a2a5..f9e5bcc8e34 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropPropagatedDependencies.kt @@ -8,11 +8,11 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.Project import org.gradle.api.file.FileCollection import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull -import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.tasks.CInteropProcess import org.jetbrains.kotlin.gradle.utils.filesProvider import java.io.File @@ -61,7 +61,7 @@ private fun Project.getPropagatedCInteropDependenciesOrEmpty(sourceSet: DefaultK compatibility metadata variant will still register a 'KotlinMetadataCompilation for 'commonMain' which is irrelevant here */ - val compilations = CompilationSourceSetUtil.compilationsBySourceSets(this)[sourceSet].orEmpty() + val compilations = sourceSet.internal.compilations .filter { compilation -> compilation !is KotlinMetadataCompilation } /* Participating in multiple compilations? -> can't propagate -> should be commonized */ diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt index f034bc095ef..64f2bb91389 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt @@ -10,11 +10,11 @@ import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.commonizer.allLeaves import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation +import org.jetbrains.kotlin.gradle.plugin.sources.internal internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? { - val allCompilationLeafTargets = compilationsBySourceSets(this)[sourceSet].orEmpty() + val allCompilationLeafTargets = sourceSet.internal.compilations .filter { compilation -> compilation !is KotlinMetadataCompilation } .map { compilation -> getCommonizerTarget(compilation) ?: return null } .allLeaves() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt index 2cd1bfdfb8b..ef89146f6c2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt @@ -69,7 +69,7 @@ internal val KotlinMultiplatformExtension.nativeRootSourceSets: Collection project.getCommonizerTarget(sourceSet) != null } return nativeSourceSets.filter { sourceSet -> - val allVisibleSourceSets = sourceSet.dependsOn + getVisibleSourceSetsFromAssociateCompilations(project, sourceSet) + val allVisibleSourceSets = sourceSet.dependsOn + getVisibleSourceSetsFromAssociateCompilations(sourceSet) allVisibleSourceSets.none { dependency -> dependency in nativeSourceSets }