From 14046b81ffcc086b004e1700a9e31e096d25f9ac Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Sat, 5 Mar 2022 13:18:19 +0100 Subject: [PATCH] Replace `transitiveClosure` (commonizer-api) with `closure` (tooling-core) --- .../plugin/mpp/pm20/KotlinGradleFragment.kt | 4 +- .../gradle/ResolveKotlinSourceSetsTest.kt | 22 +++---- .../internal/KotlinDependenciesManagement.kt | 8 +-- .../model/builder/KotlinModelBuilder.kt | 1 - .../gradle/plugin/mpp/CompilationDetails.kt | 23 ++++--- .../mpp/TransformKotlinGranularMetadata.kt | 4 +- .../gradle/plugin/mpp/kotlinCompilations.kt | 19 ++---- .../pm20/FragmentGranularMetadataResolver.kt | 2 +- .../plugin/mpp/pm20/KotlinCompilationData.kt | 5 +- ...linFragmentHostSpecificMetadataArtifact.kt | 5 +- .../plugin/mpp/pm20/KotlinGradleFragment.kt | 6 +- .../mpp/pm20/util/dependencyGraphUtils.kt | 4 +- .../plugin/sources/DefaultKotlinSourceSet.kt | 30 +++------- .../sources/SourceSetsVisibilityInference.kt | 6 +- .../KotlinMetadataTargetConfigurator.kt | 9 ++- .../targets/native/KotlinNativeCompilation.kt | 6 -- .../internal/CInteropCommonizerDependent.kt | 6 +- .../native/internal/CInteropCommonizerTask.kt | 5 +- ...ropMetadataDependencyTransformationTask.kt | 4 +- .../GetDependingNativeCompilations.kt | 4 +- .../gradle/tasks/KotlinCompileCommon.kt | 5 +- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 2 +- .../kotlin-project-model/build.gradle.kts | 2 +- .../src/main/kotlin/KotlinModuleFragment.kt | 15 +++-- .../main/kotlin/ModuleFragmentsResolver.kt | 4 +- .../main/kotlin/utils/KotlinModuleUtils.kt | 20 ++----- .../commonizer/util/transitiveClosure.kt | 32 ---------- .../commonizer/TransitiveClosureTest.kt | 60 ------------------- native/commonizer/build.gradle.kts | 3 + .../core/ClassSuperTypeCommonizer.kt | 16 ++--- .../CirTreeClassDeserializerTest.kt | 4 +- 31 files changed, 99 insertions(+), 237 deletions(-) delete mode 100644 native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt delete mode 100644 native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index f82a8ab327f..a87000e47e7 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -13,7 +13,7 @@ import org.gradle.api.file.SourceDirectorySet import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.project.model.KotlinModuleFragment -import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.withRefinesClosure interface KotlinGradleFragment : KotlinModuleFragment, HasKotlinDependencies, KotlinFragmentDependencyConfigurations, Named { override val kotlinSourceRoots: SourceDirectorySet @@ -59,4 +59,4 @@ interface KotlinGradleFragment : KotlinModuleFragment, HasKotlinDependencies, Ko } val KotlinGradleFragment.refinesClosure: Set - get() = (this as KotlinModuleFragment).refinesClosure.mapTo(mutableSetOf()) { it as KotlinGradleFragment } + get() = (this as KotlinModuleFragment).withRefinesClosure.mapTo(mutableSetOf()) { it as KotlinGradleFragment } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ResolveKotlinSourceSetsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ResolveKotlinSourceSetsTest.kt index f0e7bb5c525..f4334d84362 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ResolveKotlinSourceSetsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ResolveKotlinSourceSetsTest.kt @@ -11,8 +11,8 @@ package org.jetbrains.kotlin.gradle import org.gradle.api.Project import org.gradle.testfixtures.ProjectBuilder import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllSourceSetsDependingOn +import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure +import org.jetbrains.kotlin.gradle.plugin.sources.findSourceSetsDependingOn import org.junit.Test import kotlin.test.BeforeTest import kotlin.test.assertEquals @@ -45,17 +45,17 @@ class ResolveKotlinSourceSetsTest { assertEquals( setOf(nativeMain, linuxMain, macosMain, jvmMain), - kotlin.resolveAllSourceSetsDependingOn(commonMain) + kotlin.findSourceSetsDependingOn(commonMain) ) assertEquals( setOf(linuxMain, macosMain), - kotlin.resolveAllSourceSetsDependingOn(nativeMain) + kotlin.findSourceSetsDependingOn(nativeMain) ) - assertEquals(emptySet(), kotlin.resolveAllSourceSetsDependingOn(linuxMain)) - assertEquals(emptySet(), kotlin.resolveAllSourceSetsDependingOn(macosMain)) - assertEquals(emptySet(), kotlin.resolveAllSourceSetsDependingOn(jvmMain)) + assertEquals(emptySet(), kotlin.findSourceSetsDependingOn(linuxMain)) + assertEquals(emptySet(), kotlin.findSourceSetsDependingOn(macosMain)) + assertEquals(emptySet(), kotlin.findSourceSetsDependingOn(jvmMain)) } @Test @@ -72,19 +72,19 @@ class ResolveKotlinSourceSetsTest { macosMain.dependsOn(nativeMain) assertEquals( - setOf(nativeMain, commonMain), linuxMain.resolveAllDependsOnSourceSets() + setOf(nativeMain, commonMain), linuxMain.dependsOnClosure ) assertEquals( - setOf(commonMain), nativeMain.resolveAllDependsOnSourceSets() + setOf(commonMain), nativeMain.dependsOnClosure ) assertEquals( - emptySet(), commonMain.resolveAllDependsOnSourceSets() + emptySet(), commonMain.dependsOnClosure ) assertEquals( - setOf(commonMain), jvmMain.resolveAllDependsOnSourceSets() + setOf(commonMain), jvmMain.dependsOnClosure ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index cb4ce7e4010..5bcd3207693 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -27,9 +27,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope -import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.targets.android.findAndroidTarget import org.jetbrains.kotlin.gradle.targets.jvm.JvmCompilationsTestRunSource import org.jetbrains.kotlin.gradle.tasks.locateTask @@ -166,7 +166,7 @@ private fun chooseAndAddStdlibDependency( val sourceSetDependencyConfigurations = KotlinDependencyScope.values().map { project.sourceSetDependencyConfigurationByScope(kotlinSourceSet, it) } - val hierarchySourceSetsDependencyConfigurations = kotlinSourceSet.resolveAllDependsOnSourceSets().flatMap { hierarchySourceSet -> + val hierarchySourceSetsDependencyConfigurations = kotlinSourceSet.dependsOnClosure.flatMap { hierarchySourceSet -> KotlinDependencyScope.values().map { scope -> project.sourceSetDependencyConfigurationByScope(hierarchySourceSet, scope) } @@ -281,7 +281,7 @@ internal fun configureKotlinTestDependency(project: Project) { project.tryWithDependenciesIfUnresolved(configuration) { dependencies -> val parentOrOwnVersions: List = - kotlinSourceSet.withAllDependsOnSourceSets().filter(versionOrNullBySourceSet::contains) + kotlinSourceSet.withDependsOnClosure.filter(versionOrNullBySourceSet::contains) .map(versionOrNullBySourceSet::get) finalizingDependencies = true diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt index 0e3d5aabd30..8ffac56f408 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.gradle.model.impl.SourceSetImpl import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.getConvention import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithTransitiveClosure import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt index d7d89cb4041..bf6c2ea9643 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt @@ -15,7 +15,6 @@ import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl import org.jetbrains.kotlin.gradle.plugin.* @@ -28,8 +27,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets -import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget @@ -37,6 +36,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSou import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.project.model.LanguageSettings +import org.jetbrains.kotlin.tooling.core.closure import java.util.* import java.util.concurrent.Callable @@ -69,8 +69,8 @@ interface CompilationDetailsWithRuntime : CompilationDe val runtimeDependencyFilesHolder: DependencyFilesHolder } -internal val CompilationDetails<*>.associateWithTransitiveClosure: Iterable> - get() = transitiveClosure(this) { associateCompilations } +internal val CompilationDetails<*>.associateCompilationsClosure: Iterable> + get() = closure { it.associateCompilations } open class DefaultCompilationDetails( final override val target: KotlinTarget, @@ -122,8 +122,7 @@ open class DefaultCompilationDetails( get() = target.disambiguationClassifier override val kotlinSourceDirectoriesByFragmentName: Map - get() = directlyIncludedKotlinSourceSets.plus(directlyIncludedKotlinSourceSets.resolveAllDependsOnSourceSets()) - .associate { it.name to it.kotlin } + get() = directlyIncludedKotlinSourceSets.withDependsOnClosure.associate { it.name to it.kotlin } override val compileKotlinTaskName: String get() = lowerCamelCaseName( @@ -163,12 +162,12 @@ open class DefaultCompilationDetails( override val friendPaths: Iterable get() = mutableListOf().also { allCollections -> - associateWithTransitiveClosure.forEach { allCollections.add(it.compilationData.output.classesDirs) } + associateCompilationsClosure.forEach { allCollections.add(it.compilationData.output.classesDirs) } allCollections.add(friendArtifacts) } private val friendArtifactsTask: TaskProvider? by lazy { - if (associateWithTransitiveClosure.any { it.compilationData.isMainCompilationData() }) { + if (associateCompilationsClosure.any { it.compilationData.isMainCompilationData() }) { val archiveTasks = target.project.tasks.withType(AbstractArchiveTask::class.java) if (!archiveTasks.isEmpty()) { try { @@ -270,7 +269,7 @@ open class DefaultCompilationDetails( override fun source(sourceSet: KotlinSourceSet) { if (directlyIncludedKotlinSourceSets.add(sourceSet)) { target.project.whenEvaluated { - addExactSourceSetsEagerly(sourceSet.withAllDependsOnSourceSets()) + addExactSourceSetsEagerly(sourceSet.withDependsOnClosure) } } } @@ -389,7 +388,7 @@ internal open class SharedNativeCompilationDetails( val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(project, 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.resolveAllDependsOnSourceSets()) + addAll(defaultSourceSet.dependsOnClosure) } project.files(friendSourceSets.mapNotNull { project.getMetadataCompilationForSourceSet(it)?.output?.classesDirs }) }) @@ -671,4 +670,4 @@ internal class KotlinDependencyConfigurationsHolder( override fun dependencies(configureClosure: Closure) = dependencies f@{ project.configure(this@f, configureClosure) } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt index dc291ffd41d..fd735d0eb57 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt @@ -12,7 +12,7 @@ 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.sources.KotlinDependencyScope.* -import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.targets.metadata.ALL_COMPILE_METADATA_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvider @@ -42,7 +42,7 @@ open class TransformKotlinGranularMetadata } private val participatingSourceSets: Set - get() = transformation.kotlinSourceSet.withAllDependsOnSourceSets().toMutableSet().apply { + get() = transformation.kotlinSourceSet.withDependsOnClosure.toMutableSet().apply { if (any { it.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME }) add(project.kotlinExtension.sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 3cc8e8cc2a6..6f492880f70 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -19,11 +19,12 @@ import org.gradle.api.tasks.TaskState import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.project.model.LanguageSettings +import org.jetbrains.kotlin.tooling.core.closure import java.util.* import java.util.concurrent.Callable @@ -137,8 +138,7 @@ abstract class AbstractKotlinCompilation( get() = target override val allKotlinSourceSets: Set - get() = compilationDetails.directlyIncludedKotlinSourceSets + - compilationDetails.directlyIncludedKotlinSourceSets.resolveAllDependsOnSourceSets() + get() = compilationDetails.directlyIncludedKotlinSourceSets.withDependsOnClosure override val relatedConfigurationNames: List get() = compilationDetails.kotlinDependenciesHolder.relatedConfigurationNames + compileDependencyConfigurationName @@ -181,15 +181,8 @@ internal fun addSourcesToKotlinCompileTask( } } -internal val KotlinCompilation<*>.associateWithTransitiveClosure: Iterable> - get() = mutableSetOf>().apply { - fun visit(other: KotlinCompilation<*>) { - if (add(other)) { - other.associateWith.forEach(::visit) - } - } - associateWith.forEach(::visit) - } +internal val KotlinCompilation<*>.associateWithClosure: Iterable> + get() = this.closure { it.associateWith } abstract class AbstractKotlinCompilationToRunnableFiles( override val compilationDetails: CompilationDetailsWithRuntime, @@ -292,4 +285,4 @@ internal object CompilationSourceSetUtil { private val invalidModuleNameCharactersRegex = """[\\/\r\n\t]""".toRegex() internal fun filterModuleName(moduleName: String): String = - moduleName.replace(invalidModuleNameCharactersRegex, "_") \ No newline at end of file + moduleName.replace(invalidModuleNameCharactersRegex, "_") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolver.kt index 837a53298c2..c443c6a76d7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolver.kt @@ -157,7 +157,7 @@ internal class FragmentGranularMetadataResolver( val relevantVariantResolution = variantResolutions .filterIsInstance() // find some of our variants that resolved a dependency's variant containing the fragment - .find { hostSpecificFragment in it.chosenVariant.refinesClosure } + .find { hostSpecificFragment in it.chosenVariant.withRefinesClosure } // resolve the dependencies of that variant getting the host-specific metadata artifact relevantVariantResolution?.let { resolution -> val configurationResolvingPlatformVariant = diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt index 5e2aeed5618..771bd8870e8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt @@ -9,7 +9,6 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions -import org.jetbrains.kotlin.gradle.dsl.pm20Extension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.GradleModuleVariantResolver import org.jetbrains.kotlin.gradle.plugin.mpp.isMain @@ -18,7 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.project.model.VariantResolution -import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.withRefinesClosure interface KotlinVariantCompilationDataInternal : KotlinVariantCompilationData { override val compileKotlinTaskName: String @@ -28,7 +27,7 @@ interface KotlinVariantCompilationDataInternal : Kotlin get() = owner.disambiguateName("classes") override val kotlinSourceDirectoriesByFragmentName: Map - get() = owner.refinesClosure.filterIsInstance().associate { it.disambiguateName("") to it.kotlinSourceRoots } + get() = owner.withRefinesClosure.filterIsInstance().associate { it.disambiguateName("") to it.kotlinSourceRoots } override val friendPaths: Iterable get() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt index 93a0894bfbf..61a6a350b13 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt @@ -7,12 +7,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.artifacts.Dependency import org.gradle.jvm.tasks.Jar -import org.jetbrains.kotlin.gradle.dsl.pm20Extension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION -import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.withRefinesClosure /** * Will register a 'hostSpecificMetadataJar' [Jar] task containing compilation outputs of host specific metadata. @@ -30,7 +29,7 @@ val KotlinFragmentHostSpecificMetadataArtifact = FragmentArtifacts() })) { spec -> spec.into(metadataFragment.name) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index 0606d77476f..fc560002896 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -11,13 +11,11 @@ import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.gradle.api.provider.Provider import org.gradle.util.ConfigureUtil -import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelContainer import org.jetbrains.kotlin.gradle.kpm.KotlinMutableExternalModelContainer import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinDependencyHandler -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinDependencyConfigurationsHolder import org.jetbrains.kotlin.gradle.plugin.mpp.toModuleDependency import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.FragmentConsistencyChecker @@ -26,7 +24,7 @@ import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated import org.jetbrains.kotlin.project.model.KotlinModuleDependency import org.jetbrains.kotlin.project.model.KotlinModuleFragment -import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.withRefinesClosure import javax.inject.Inject open class KotlinGradleFragmentInternal @Inject constructor( @@ -118,4 +116,4 @@ open class KotlinGradleFragmentInternal @Inject constructor( } val KotlinGradleFragment.refinesClosure: Set - get() = (this as KotlinModuleFragment).refinesClosure.map { it as KotlinGradleFragment }.toSet() + get() = (this as KotlinModuleFragment).withRefinesClosure.map { it as KotlinGradleFragment }.toSet() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/dependencyGraphUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/dependencyGraphUtils.kt index 7d6139f76e9..8bac2b86a4b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/dependencyGraphUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/util/dependencyGraphUtils.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util -import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleDependencyGraph import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleDependencyGraphNode import org.jetbrains.kotlin.project.model.KotlinModule +import org.jetbrains.kotlin.tooling.core.withClosure internal val GradleDependencyGraph.allDependencyNodes: Iterable - get() = transitiveClosure(root) { dependenciesByFragment.values.flatten() } + get() = root.withClosure { it.dependenciesByFragment.values.flatten() } internal val GradleDependencyGraph.allDependencyModules: Iterable get() = allDependencyNodes.map { it.module } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index 9a44ca5fd44..17dfcfe15ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -11,13 +11,14 @@ import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS -import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.utils.* +import org.jetbrains.kotlin.tooling.core.closure +import org.jetbrains.kotlin.tooling.core.withClosure import java.io.File import java.util.* @@ -252,28 +253,15 @@ internal fun KotlinSourceSet.disambiguateName(simpleName: String): String { internal fun createDefaultSourceDirectorySet(project: Project, name: String?): SourceDirectorySet = project.objects.sourceDirectorySet(name!!, name) -/** - * Like [resolveAllDependsOnSourceSets] but will include the receiver source set also! - */ -internal fun KotlinSourceSet.withAllDependsOnSourceSets(): Set { - return this + this.resolveAllDependsOnSourceSets() -} -internal operator fun KotlinSourceSet.plus(sourceSets: Set): Set { - return HashSet(sourceSets.size + 1).also { set -> - set.add(this) - set.addAll(sourceSets) - } -} +val KotlinSourceSet.dependsOnClosure get() = closure { it.dependsOn } -internal fun KotlinSourceSet.resolveAllDependsOnSourceSets(): Set { - return transitiveClosure(this) { dependsOn } -} +val KotlinSourceSet.withDependsOnClosure get() = withClosure { it.dependsOn } -internal fun Iterable.resolveAllDependsOnSourceSets(): Set { - return flatMapTo(mutableSetOf()) { it.resolveAllDependsOnSourceSets() } -} +val Iterable.dependsOnClosure get() = closure { it.dependsOn } -internal fun KotlinMultiplatformExtension.resolveAllSourceSetsDependingOn(sourceSet: KotlinSourceSet): Set { - return transitiveClosure(sourceSet) { sourceSets.filter { otherSourceSet -> this in otherSourceSet.dependsOn } } +val Iterable.withDependsOnClosure get() = withClosure { it.dependsOn } + +internal fun KotlinMultiplatformExtension.findSourceSetsDependingOn(sourceSet: KotlinSourceSet): Set { + return sourceSet.closure { seedSourceSet -> sourceSets.filter { otherSourceSet -> seedSourceSet in otherSourceSet.dependsOn } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt index 1853429b120..fe01e5303db 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/SourceSetsVisibilityInference.kt @@ -11,10 +11,10 @@ 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.associateWithTransitiveClosure +import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure fun getSourceSetsFromAssociatedCompilations(fromCompilation: KotlinCompilation<*>): Map, Set> = - fromCompilation.associateWithTransitiveClosure.associate { it to it.allKotlinSourceSets } + fromCompilation.associateWithClosure.associate { it to it.allKotlinSourceSets } fun getVisibleSourceSetsFromAssociateCompilations( project: Project, @@ -140,7 +140,7 @@ internal fun checkSourceSetVisibilityRequirements( val inferredVisibility = getVisibleSourceSetsFromAssociateCompilations(compilationsBySourceSet[sourceSet].orEmpty()) - val requiredButNotVisible = requiredVisibility - inferredVisibility - sourceSet.withAllDependsOnSourceSets() + val requiredButNotVisible = requiredVisibility - inferredVisibility - sourceSet.withDependsOnClosure if (requiredButNotVisible.isNotEmpty()) { val compilations = compilationsBySourceSet.getValue(sourceSet) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index c09cbcc4c30..de5212cf77d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -23,7 +23,6 @@ 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.mpp.pm20.metadataCompilationRegistryByModuleId import org.jetbrains.kotlin.gradle.plugin.sources.* import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.native.internal.* @@ -257,7 +256,7 @@ class KotlinMetadataTargetConfigurator : * See also: [buildKotlinProjectStructureMetadata], where these dependencies must be included into the source set exported deps. */ if (isSharedNativeCompilation) { - sourceSet.withAllDependsOnSourceSets().forEach { hierarchySourceSet -> + sourceSet.withDependsOnClosure.forEach { hierarchySourceSet -> apiElementsConfiguration.extendsFrom( sourceSetDependencyConfigurationByScope(hierarchySourceSet, KotlinDependencyScope.IMPLEMENTATION_SCOPE) ) @@ -438,14 +437,14 @@ class KotlinMetadataTargetConfigurator : val sourceSet = compilation.defaultSourceSet val dependsOnCompilationOutputs = lazy { - sourceSet.withAllDependsOnSourceSets().mapNotNull { hierarchySourceSet -> + sourceSet.withDependsOnClosure.mapNotNull { hierarchySourceSet -> val dependencyCompilation = project.getMetadataCompilationForSourceSet(hierarchySourceSet) dependencyCompilation?.output?.classesDirs.takeIf { hierarchySourceSet != sourceSet } } } val resolvedMetadataFilesProviders = lazy { - val transformationTaskHolders = sourceSet.withAllDependsOnSourceSets().mapNotNull { hierarchySourceSet -> + val transformationTaskHolders = sourceSet.withDependsOnClosure.mapNotNull { hierarchySourceSet -> project.locateTask(transformGranularMetadataTaskName(hierarchySourceSet.name)) } transformationTaskHolders.map { SourceSetResolvedMetadataProvider(it) } @@ -565,7 +564,7 @@ internal fun isSharedNativeSourceSet(project: Project, sourceSet: KotlinSourceSe } internal fun dependsOnClosureWithInterCompilationDependencies(project: Project, sourceSet: KotlinSourceSet): Set = - sourceSet.resolveAllDependsOnSourceSets().toMutableSet().apply { + sourceSet.dependsOnClosure.toMutableSet().apply { addAll(getVisibleSourceSetsFromAssociateCompilations(project, sourceSet)) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 8b8f4e5b03d..9adacce56d8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -10,19 +10,13 @@ import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project -import org.gradle.api.file.FileCollection import org.gradle.api.tasks.TaskProvider import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeCompilationData import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeFragmentMetadataCompilationData -import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets -import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile -import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt index 5a4e36b0383..6cbf6ec9fdb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerDependent.kt @@ -11,7 +11,7 @@ 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.associateWithTransitiveClosure +import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropIdentifier.Scope import org.jetbrains.kotlin.gradle.utils.UnsafeApi @@ -59,7 +59,7 @@ internal fun CInteropCommonizerDependent.Factory.from( This relationship should not be declared, but we try to be lenient towards it here. */ val filteredCompilations = compilations.filter { compilation -> - compilation.associateWithTransitiveClosure.none { associateCompilation -> associateCompilation in compilations } + compilation.associateWithClosure.none { associateCompilation -> associateCompilation in compilations } }.ifEmpty { return null }.toSet() val scopes: Set = filteredCompilations @@ -95,7 +95,7 @@ internal fun CInteropCommonizerDependent.Factory.fromAssociateCompilations( target = project.getCommonizerTarget(sourceSet) as? SharedCommonizerTarget ?: return null, compilations = (compilationsBySourceSets(project)[sourceSet] ?: return null) .filterIsInstance() - .flatMap { compilation -> compilation.associateWithTransitiveClosure } + .flatMap { compilation -> compilation.associateWithClosure } .filterIsInstance() .toSet() ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt index d8c420b3ae1..e43386e465c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerTask.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinSourceSetsIncludingDefault -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist import org.jetbrains.kotlin.gradle.tasks.CInteropProcess import org.jetbrains.kotlin.konan.target.KonanTarget @@ -34,7 +34,8 @@ internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() { ) { @Suppress("unused") // Used for UP-TO-DATE check @get:Input - val allSourceSetNames: Provider> = sourceSets.map { it.resolveAllDependsOnSourceSets().map(Any::toString) } + val allSourceSetNames: Provider> = sourceSets + .map { it.withDependsOnClosure.map(Any::toString) } } override val outputDirectory: File = project.buildDir.resolve("classes/kotlin/commonizer") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt index e5288f3ce9e..cd2f472259f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.Choos import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleIdentifiers import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.SourceSetMetadataStorageForIde -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.withType @@ -87,7 +87,7 @@ internal fun Project.locateOrRegisterCInteropMetadataDependencyTransformationTas */ private fun CInteropMetadataDependencyTransformationTask.configureTaskOrder() { val tasksForVisibleSourceSets = Callable { - val allVisibleSourceSets = sourceSet.resolveAllDependsOnSourceSets() + sourceSet.getAdditionalVisibleSourceSets() + val allVisibleSourceSets = sourceSet.dependsOnClosure + sourceSet.getAdditionalVisibleSourceSets() project.tasks.withType().matching { it.sourceSet in allVisibleSourceSets } } mustRunAfter(tasksForVisibleSourceSets) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetDependingNativeCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetDependingNativeCompilations.kt index 2f3b972c1eb..bd9e921c23b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetDependingNativeCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetDependingNativeCompilations.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinSourceSetsIncludingDefault -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure internal fun KotlinSharedNativeCompilation.getImplicitlyDependingNativeCompilations(): Set { val multiplatformExtension = project.multiplatformExtensionOrNull ?: return emptySet() @@ -30,5 +30,5 @@ internal fun KotlinSharedNativeCompilation.getImplicitlyDependingNativeCompilati * see KT-45412 */ private fun KotlinCompilation<*>.allParticipatingSourceSets(): Set { - return kotlinSourceSetsIncludingDefault + kotlinSourceSetsIncludingDefault.resolveAllDependsOnSourceSets() + return kotlinSourceSetsIncludingDefault.withDependsOnClosure } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt index 056a586991b..357e843e6d4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt @@ -38,8 +38,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.AbstractKotlinFragmentMetadat import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinMetadataCompilationData import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.refinesClosure -import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets -import org.jetbrains.kotlin.gradle.report.BuildReportMode +import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure import org.jetbrains.kotlin.gradle.utils.propertyWithConvention import java.io.File import javax.inject.Inject @@ -65,7 +64,7 @@ abstract class KotlinCompileCommon @Inject constructor( is KotlinCompilation<*> -> { val defaultKotlinSourceSet: KotlinSourceSet = compilation.defaultSourceSet val metadataTarget = compilation.owner as KotlinTarget - defaultKotlinSourceSet.resolveAllDependsOnSourceSets() + defaultKotlinSourceSet.dependsOnClosure .mapNotNull { sourceSet -> metadataTarget.compilations.findByName(sourceSet.name)?.output?.classesDirs } .flatten() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 1d435e7c6e5..faf92b722cb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -181,7 +181,7 @@ abstract class AbstractKotlinCompile : AbstractKotl task.friendPaths.from(project.provider { compilation.friendPaths }) if (compilation is KotlinCompilation<*>) { - task.friendSourceSets.set(project.provider { compilation.associateWithTransitiveClosure.map { it.name } }) + task.friendSourceSets.set(project.provider { compilation.associateWithClosure.map { it.name } }) // FIXME support compiler plugins with PM20 task.pluginClasspath.from(project.configurations.getByName(compilation.pluginConfigurationName)) } diff --git a/libraries/tools/kotlin-project-model/build.gradle.kts b/libraries/tools/kotlin-project-model/build.gradle.kts index 894a3aaad7d..a6655657acd 100644 --- a/libraries/tools/kotlin-project-model/build.gradle.kts +++ b/libraries/tools/kotlin-project-model/build.gradle.kts @@ -9,7 +9,7 @@ standardPublicJars() dependencies { implementation(kotlinStdlib()) - + implementation(project(":kotlin-tooling-core")) testImplementation(kotlin("test-junit")) } diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt index b07bc492fd2..de38f42ed83 100644 --- a/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.project.model import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment +import org.jetbrains.kotlin.tooling.core.closure +import org.jetbrains.kotlin.tooling.core.withClosure import java.io.File interface KotlinModuleFragment { @@ -39,13 +41,10 @@ val KotlinModuleFragment.fragmentAttributeSets: Map - get() = mutableSetOf().apply { - fun visit(moduleFragment: KotlinModuleFragment) { - if (add(moduleFragment)) - moduleFragment.directRefinesDependencies.forEach(::visit) - } - visit(this@refinesClosure) - } + get() = this.closure { it.directRefinesDependencies } + +val KotlinModuleFragment.withRefinesClosure: Set + get() = this.withClosure { it.directRefinesDependencies } val KotlinModuleVariant.platform get() = variantAttributes[KotlinPlatformTypeAttribute] @@ -67,7 +66,7 @@ class BasicKotlinModuleVariant( containingModule: KotlinModule, fragmentName: String, languageSettings: LanguageSettings? = null -) : BasicKotlinModuleFragment ( +) : BasicKotlinModuleFragment( containingModule, fragmentName, languageSettings diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/ModuleFragmentsResolver.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/ModuleFragmentsResolver.kt index 4c6979bf8cc..98049fb46e6 100644 --- a/libraries/tools/kotlin-project-model/src/main/kotlin/ModuleFragmentsResolver.kt +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/ModuleFragmentsResolver.kt @@ -49,7 +49,7 @@ class DefaultModuleFragmentsResolver( val chosenFragments = chosenVariants.map { variantResolution -> when (variantResolution) { - is VariantResolution.VariantMatch -> variantResolution.chosenVariant.refinesClosure + is VariantResolution.VariantMatch -> variantResolution.chosenVariant.withRefinesClosure else -> emptySet() } } @@ -63,4 +63,4 @@ class DefaultModuleFragmentsResolver( return FragmentResolution.ChosenFragments(requestingFragment, dependencyModule, result, chosenVariants) } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/utils/KotlinModuleUtils.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/utils/KotlinModuleUtils.kt index 99df8cb8a3b..4c4c500842f 100644 --- a/libraries/tools/kotlin-project-model/src/main/kotlin/utils/KotlinModuleUtils.kt +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/utils/KotlinModuleUtils.kt @@ -8,22 +8,14 @@ package org.jetbrains.kotlin.project.model.utils import org.jetbrains.kotlin.project.model.KotlinModule import org.jetbrains.kotlin.project.model.KotlinModuleFragment import org.jetbrains.kotlin.project.model.KotlinModuleVariant -import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.withRefinesClosure +import org.jetbrains.kotlin.tooling.core.closure fun KotlinModule.variantsContainingFragment(fragment: KotlinModuleFragment): Iterable = - variants.filter { fragment in it.refinesClosure } + variants.filter { variant -> fragment in variant.withRefinesClosure } fun KotlinModule.findRefiningFragments(fragment: KotlinModuleFragment): Iterable { - val refining = mutableSetOf() - val notRefining = mutableSetOf() - - fun isRefining(other: KotlinModuleFragment): Boolean = when { - other in refining -> true - other in notRefining -> false - fragment in other.directRefinesDependencies -> true.also { refining.add(other) } - fragment.directRefinesDependencies.any { isRefining(it) } -> true.also { refining.add(other) } - else -> false.also { notRefining.add(other) } + return fragment.closure { seedFragment -> + fragments.filter { otherFragment -> seedFragment in otherFragment.directRefinesDependencies } } - - return fragments.filter(::isRefining) -} \ No newline at end of file +} diff --git a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt deleted file mode 100644 index 134c74046a0..00000000000 --- a/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010-2021 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.commonizer.util - - -public inline fun transitiveClosure(seed: T, edges: T.() -> Iterable): Set { - // Fast path when initial edges are empty - val initialEdges = seed.edges() - if (initialEdges is Collection && initialEdges.isEmpty()) return emptySet() - - val queue = deque(initialEdges.count() * 2) - val results = mutableSetOf() - queue.addAll(initialEdges) - while (queue.isNotEmpty()) { - // ArrayDeque implementation will optimize this call to 'removeFirst' - val resolved = queue.removeAt(0) - if (resolved != seed && results.add(resolved)) { - queue.addAll(resolved.edges()) - } - } - - return results.toSet() -} - -@PublishedApi -internal inline fun deque(initialSize: Int): MutableList { - return if (KotlinVersion.CURRENT.isAtLeast(1, 4)) ArrayDeque(initialSize) - else ArrayList(initialSize) -} diff --git a/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt b/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt deleted file mode 100644 index 1d5557f13e9..00000000000 --- a/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010-2021 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.commonizer - -import kotlin.test.Test -import kotlin.test.assertEquals - -class TransitiveClosureTest { - private class Node(val value: String, val children: MutableList = mutableListOf()) { - - override fun toString(): String { - return value - } - - override fun equals(other: Any?): Boolean { - if (other !is Node) return false - return other.value == value - } - - override fun hashCode(): Int { - return value.hashCode() - } - } - - private fun Node.transitiveClosure() = org.jetbrains.kotlin.commonizer.util.transitiveClosure(this) { children } - - @Test - fun `transitiveClosure does not include root node`() { - val closure = Node("a", mutableListOf(Node("b"), Node("c"))).transitiveClosure() - assertEquals(setOf(Node("b"), Node("c")), closure, "Expected transitiveClosure to not include root node") - } - - @Test - fun `transitiveClosure handles loop and self references`() { - val nodeA = Node("a") - val nodeB = Node("b") - val nodeC = Node("c") - val nodeD = Node("d") - - // a -> b -> c -> d - nodeA.children.add(nodeB) - nodeB.children.add(nodeC) - nodeC.children.add(nodeD) - - // add self reference to b - nodeB.children.add(nodeB) - - // add loop from c -> a - nodeC.children.add(nodeA) - - val closure = nodeA.transitiveClosure() - assertEquals( - setOf(nodeB, nodeC, nodeD), closure, - "Expected transitiveClosure to be robust against loops and self references" - ) - } -} diff --git a/native/commonizer/build.gradle.kts b/native/commonizer/build.gradle.kts index 9a9cce01c2f..8cf72b13668 100644 --- a/native/commonizer/build.gradle.kts +++ b/native/commonizer/build.gradle.kts @@ -16,12 +16,14 @@ dependencies { embedded(project(":kotlinx-metadata-klib")) { isTransitive = false } embedded(project(":kotlinx-metadata")) { isTransitive = false } embedded(project(":native:kotlin-klib-commonizer-api")) { isTransitive = false } + embedded(project(":kotlin-tooling-core")) { isTransitive = false } // N.B. The order of "kotlinx-metadata*" dependencies makes sense for runtime classpath // of the "runCommonizer" task. Please, don't mix them up. compileOnly(project(":kotlinx-metadata-klib")) { isTransitive = false } compileOnly(project(":kotlinx-metadata")) { isTransitive = false } compileOnly(project(":native:kotlin-klib-commonizer-api")) { isTransitive = false } + compileOnly(project(":kotlin-tooling-core")) { isTransitive = false } compileOnly(project(":compiler:cli-common")) compileOnly(project(":compiler:ir.serialization.common")) compileOnly(project(":compiler:frontend")) @@ -40,6 +42,7 @@ dependencies { testImplementation(project(":kotlinx-metadata-klib")) { isTransitive = false } testImplementation(project(":kotlinx-metadata")) { isTransitive = false } testImplementation(project(":native:kotlin-klib-commonizer-api")) + testImplementation(project(":kotlin-tooling-core")) testApi(intellijCore()) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassSuperTypeCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassSuperTypeCommonizer.kt index 01eb7e698f8..c6a2e5a9c8d 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassSuperTypeCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/ClassSuperTypeCommonizer.kt @@ -5,16 +5,12 @@ package org.jetbrains.kotlin.commonizer.core -import org.jetbrains.kotlin.commonizer.cir.CirClassType -import org.jetbrains.kotlin.commonizer.cir.CirEntityId -import org.jetbrains.kotlin.commonizer.cir.CirType -import org.jetbrains.kotlin.commonizer.cir.SimpleCirSupertypesResolver +import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.mergedtree.CirClassifierIndex import org.jetbrains.kotlin.commonizer.mergedtree.CirKnownClassifiers -import org.jetbrains.kotlin.commonizer.cir.CirProvided import org.jetbrains.kotlin.commonizer.mergedtree.findClass -import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.tooling.core.withClosure private typealias Supertypes = List @@ -188,12 +184,8 @@ private class TypeNode( val supertypes: List, var isConsumed: Boolean = false ) { - val allNodes: List by lazy { - val allSupertypes = transitiveClosure(this, TypeNode::supertypes) - ArrayList(allSupertypes.size + 1).also { list -> - list.add(this) - list.addAll(allSupertypes) - } + val allNodes: Set by lazy { + this.withClosure(TypeNode::supertypes) } override fun toString(): String { diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializerTest.kt index 2a113d6189d..0e7b73a083c 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializerTest.kt @@ -7,10 +7,10 @@ package org.jetbrains.kotlin.commonizer.tree.deserializer import org.jetbrains.kotlin.commonizer.cir.CirClassType import org.jetbrains.kotlin.commonizer.tree.CirTreeClass -import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.tooling.core.withClosure import kotlin.test.* class CirTreeClassDeserializerTest : AbstractCirTreeDeserializerTest() { @@ -130,7 +130,7 @@ class CirTreeClassDeserializerTest : AbstractCirTreeDeserializerTest() { ) val pkg = module.assertSinglePackage() - val xClass = pkg.classes.flatMap { transitiveClosure(it, CirTreeClass::classes) + it } + val xClass = pkg.classes.withClosure { it.classes } .singleOrNull { it.clazz.name.toStrippedString() == "X" } ?: kotlin.test.fail("Missing class 'X'") val xSuperType = xClass.clazz.supertypes.singleOrNull() ?: kotlin.test.fail("Expected single supertype for 'X'. Found ${xClass.clazz.supertypes}")