From 47f36c04fc9ced7d9802190bae325b3da89aca20 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 26 Mar 2021 10:30:02 +0100 Subject: [PATCH] Move transitiveClosure into :commonizer-api --- .../gradle/plugin/sources/DefaultKotlinSourceSet.kt | 5 +++-- .../targets/native/internal/CInteropCommonizerTask.kt | 4 ++-- .../kotlin/commonizer/util}/transitiveClosure.kt | 11 ++++++----- .../kotlin/commonizer}/TransitiveClosureTest.kt | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) rename {libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils => native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util}/transitiveClosure.kt (79%) rename {libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/utils => native/commonizer-api/test/org/jetbrains/kotlin/commonizer}/TransitiveClosureTest.kt (91%) 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 f54d4dc3f91..011639127fb 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,6 +11,7 @@ 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 @@ -246,7 +247,7 @@ internal operator fun KotlinSourceSet.plus(sourceSets: Set): Se } internal fun KotlinSourceSet.resolveAllDependsOnSourceSets(): Set { - return transitiveClosure { dependsOn } + return transitiveClosure(this) { dependsOn } } internal fun Iterable.resolveAllDependsOnSourceSets(): Set { @@ -254,5 +255,5 @@ internal fun Iterable.resolveAllDependsOnSourceSets(): Set { - return sourceSet.transitiveClosure { sourceSets.filter { otherSourceSet -> this in otherSourceSet.dependsOn } } + return transitiveClosure(sourceSet) { sourceSets.filter { otherSourceSet -> this in otherSourceSet.dependsOn } } } 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 61580012424..1746df6d4e6 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 @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinSourceSetsIncludingDefault import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerTask.CInteropGist import org.jetbrains.kotlin.gradle.tasks.CInteropProcess -import org.jetbrains.kotlin.gradle.utils.transitiveClosure +import org.jetbrains.kotlin.commonizer.util.transitiveClosure import org.jetbrains.kotlin.gradle.utils.fileProvider import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File @@ -211,7 +211,7 @@ private operator fun CommonizerTarget.contains(other: CommonizerTarget): Boolean } private fun SharedCommonizerTarget.withAllTransitiveTargets(): Set { - return setOf(this) + this.transitiveClosure { if (this is SharedCommonizerTarget) this.targets else emptySet() } + return setOf(this) + transitiveClosure(this) { if (this is SharedCommonizerTarget) this.targets else emptySet() } } private fun Project.getDependingNativeCompilations(compilation: KotlinSharedNativeCompilation): Set { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/transitiveClosure.kt b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt similarity index 79% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/transitiveClosure.kt rename to native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt index eb33189186c..73c3ac2a83e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/transitiveClosure.kt +++ b/native/commonizer-api/src/org/jetbrains/kotlin/commonizer/util/transitiveClosure.kt @@ -3,7 +3,7 @@ * 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.gradle.utils +package org.jetbrains.kotlin.commonizer.util /** * General purpose implementation of a transitive closure @@ -13,9 +13,9 @@ package org.jetbrains.kotlin.gradle.utils * @param edges: Producer function from one node to all its children. This implementation can handle loops and self references gracefully. * @return Note: No guarantees given about the order ot this [Set] */ -internal inline fun T.transitiveClosure(edges: T.() -> Iterable): Set { +public inline fun transitiveClosure(seed: T, edges: T.() -> Iterable): Set { // Fast path when initial edges are empty - val initialEdges = edges() + val initialEdges = seed.edges() if (initialEdges is Collection && initialEdges.isEmpty()) return emptySet() val queue = deque() @@ -24,7 +24,7 @@ internal inline fun T.transitiveClosure(edges: T.() -> Iterable): while (queue.isNotEmpty()) { // ArrayDeque implementation will optimize this call to 'removeFirst' val resolved = queue.removeAt(0) - if (resolved != this && results.add(resolved)) { + if (resolved != seed && results.add(resolved)) { queue.addAll(resolved.edges()) } } @@ -33,7 +33,8 @@ internal inline fun T.transitiveClosure(edges: T.() -> Iterable): } @OptIn(ExperimentalStdlibApi::class) -private inline fun deque(): MutableList { +@PublishedApi +internal inline fun deque(): MutableList { return if (KotlinVersion.CURRENT.isAtLeast(1, 4)) ArrayDeque() else mutableListOf() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/utils/TransitiveClosureTest.kt b/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt similarity index 91% rename from libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/utils/TransitiveClosureTest.kt rename to native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt index 0e8011ba1b2..1d5557f13e9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/utils/TransitiveClosureTest.kt +++ b/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/TransitiveClosureTest.kt @@ -3,7 +3,7 @@ * 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.gradle.utils +package org.jetbrains.kotlin.commonizer import kotlin.test.Test import kotlin.test.assertEquals @@ -25,7 +25,7 @@ class TransitiveClosureTest { } } - private fun Node.transitiveClosure() = transitiveClosure { children } + private fun Node.transitiveClosure() = org.jetbrains.kotlin.commonizer.util.transitiveClosure(this) { children } @Test fun `transitiveClosure does not include root node`() {