[Commonizer] Replace InputTargetsSelectorInterface with a simple function

^KT-47301
This commit is contained in:
sebastian.sellmair
2021-06-22 15:21:58 +02:00
committed by Space
parent 5a8b39e08d
commit 770efb7ecb
4 changed files with 30 additions and 48 deletions

View File

@@ -22,8 +22,7 @@ internal fun CommonizerQueue(parameters: CommonizerParameters): CommonizerQueue
CommonizerQueue.Deserializer { deserializeTarget(parameters, target) }
},
commonizer = { inputs, output -> commonizeTarget(parameters, inputs, output) },
serializer = { declarations, outputTarget -> serializeTarget(parameters, declarations, outputTarget) },
inputTargetsSelector = DefaultInputTargetsSelector
serializer = { declarations, outputTarget -> serializeTarget(parameters, declarations, outputTarget) }
)
}
@@ -33,7 +32,6 @@ internal class CommonizerQueue(
private val deserializers: TargetDependent<Deserializer>,
private val commonizer: Commonizer,
private val serializer: Serializer,
private val inputTargetsSelector: InputTargetsSelector
) {
fun interface Deserializer {
@@ -116,7 +114,7 @@ internal class CommonizerQueue(
}
private fun registerTargetDependencies(outputTarget: OutputCommonizerTarget) {
targetDependencies[outputTarget] = inputTargetsSelector(outputTargets + deserializers.targets, outputTarget)
targetDependencies[outputTarget] = selectInputTargets(outputTargets + deserializers.targets, outputTarget)
}
private fun removeTargetDependencies(target: OutputCommonizerTarget) {
@@ -140,4 +138,4 @@ internal class CommonizerQueue(
init {
outputTargets.forEach(this::enqueue)
}
}
}

View File

@@ -8,34 +8,20 @@ package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.utils.isProperSubsetOf
import org.jetbrains.kotlin.commonizer.utils.isSubsetOf
internal fun interface InputTargetsSelector {
operator fun invoke(inputTargets: Set<CommonizerTarget>, outputTarget: SharedCommonizerTarget): Set<CommonizerTarget>
}
internal fun selectInputTargets(inputTargets: Set<CommonizerTarget>, outputTarget: SharedCommonizerTarget): Set<CommonizerTarget> {
val subsetInputTargets = inputTargets
.filter { inputTarget -> inputTarget != outputTarget && inputTarget.allLeaves() isSubsetOf outputTarget.allLeaves() }
.sortedBy { it.allLeaves().size }
internal operator fun InputTargetsSelector.invoke(
parameters: CommonizerParameters,
outputTarget: SharedCommonizerTarget
): Set<CommonizerTarget> {
return invoke(parameters.outputTargets + parameters.targetProviders.targets, outputTarget)
}
internal object DefaultInputTargetsSelector : InputTargetsSelector {
override fun invoke(inputTargets: Set<CommonizerTarget>, outputTarget: SharedCommonizerTarget): Set<CommonizerTarget> {
val subsetInputTargets = inputTargets
.filter { inputTarget -> inputTarget != outputTarget && inputTarget.allLeaves() isSubsetOf outputTarget.allLeaves() }
.sortedBy { it.allLeaves().size }
val disjointSubsetInputTargets = subsetInputTargets
.filter { inputTarget ->
subsetInputTargets.none { potentialSuperSet -> inputTarget.allLeaves() isProperSubsetOf potentialSuperSet.allLeaves() }
}
return outputTarget.allLeaves().fold(setOf()) { selectedInputTargets, outputLeafTarget ->
if (outputLeafTarget in selectedInputTargets.allLeaves()) return@fold selectedInputTargets
selectedInputTargets + (disjointSubsetInputTargets.firstOrNull { inputTarget -> outputLeafTarget in inputTarget.allLeaves() }
?: failedSelectingInputTargets(inputTargets, outputTarget))
val disjointSubsetInputTargets = subsetInputTargets
.filter { inputTarget ->
subsetInputTargets.none { potentialSuperSet -> inputTarget.allLeaves() isProperSubsetOf potentialSuperSet.allLeaves() }
}
return outputTarget.allLeaves().fold(setOf()) { selectedInputTargets, outputLeafTarget ->
if (outputLeafTarget in selectedInputTargets.allLeaves()) return@fold selectedInputTargets
selectedInputTargets + (disjointSubsetInputTargets.firstOrNull { inputTarget -> outputLeafTarget in inputTarget.allLeaves() }
?: failedSelectingInputTargets(inputTargets, outputTarget))
}
}
@@ -45,4 +31,4 @@ private fun failedSelectingInputTargets(inputTargets: Set<CommonizerTarget>, out
"inputTargets=$inputTargets\n" +
"missing leaf targets: ${outputTarget.allLeaves() - inputTargets.allLeaves()}"
)
}
}

View File

@@ -25,7 +25,6 @@ class CommonizerQueueTest {
) { CommonizerQueue.Deserializer { null } },
commonizer = { _, _ -> null },
serializer = { _, _ -> },
inputTargetsSelector = DefaultInputTargetsSelector
)
assertEquals(
@@ -104,7 +103,6 @@ class CommonizerQueueTest {
CirRootNode(CommonizedGroup(0), storageManager.createNullableLazyValue { CirRoot.create(output) })
},
serializer = { _, _ -> },
inputTargetsSelector = DefaultInputTargetsSelector
)
queue.invokeAll()
@@ -121,14 +119,14 @@ class CommonizerQueueTest {
val abInvocation = commonizerInvocations.single { it.output == abOutputTarget }
assertEquals(
DefaultInputTargetsSelector(providedTargets + outputTargets, abOutputTarget),
selectInputTargets(providedTargets + outputTargets, abOutputTarget),
abInvocation.inputs.targets.toSet(),
"Expected commonizer being invoked with selected targets for abInvocation"
)
val abcInvocation = commonizerInvocations.single { it.output == abcOutputTarget }
assertEquals(
DefaultInputTargetsSelector(providedTargets + outputTargets, abcOutputTarget),
selectInputTargets(providedTargets + outputTargets, abcOutputTarget),
abcInvocation.inputs.targets.toSet(),
"Expected commonizer being invoked with selected targets for abcInvocation"
)

View File

@@ -10,14 +10,14 @@ import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertTrue
class DefaultInputTargetsSelectorTest {
class SelectInputTargetsTest {
@Test
fun `missing leaf targets`() {
val inputTargets = setOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b"))
val exception = assertFailsWith<IllegalArgumentException> {
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c)") as SharedCommonizerTarget)
}
assertTrue(
@@ -43,17 +43,17 @@ class DefaultInputTargetsSelectorTest {
assertEquals(
setOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b")),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b)") as SharedCommonizerTarget)
)
assertEquals(
setOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b"), LeafCommonizerTarget("c")),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c)") as SharedCommonizerTarget)
)
assertEquals(
setOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b"), parseCommonizerTarget("(c, d)")),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c, d)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c, d)") as SharedCommonizerTarget)
)
}
@@ -70,17 +70,17 @@ class DefaultInputTargetsSelectorTest {
assertEquals(
setOf("(a, b, c, d)", "f").map(::parseCommonizerTarget).toSet(),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c, d, f)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c, d, f)") as SharedCommonizerTarget)
)
assertEquals(
setOf("(a, b, c, d)", "(c, d, e)").map(::parseCommonizerTarget).toSet(),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c, d, e)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c, d, e)") as SharedCommonizerTarget)
)
assertEquals(
setOf("(a, b, c, d)", "(c, d, e)", "f").map(::parseCommonizerTarget).toSet(),
DefaultInputTargetsSelector(inputTargets, parseCommonizerTarget("(a, b, c, d, e, f)") as SharedCommonizerTarget)
selectInputTargets(inputTargets, parseCommonizerTarget("(a, b, c, d, e, f)") as SharedCommonizerTarget)
)
}
@@ -88,7 +88,7 @@ class DefaultInputTargetsSelectorTest {
fun `empty outputTarget`() {
assertEquals(
emptySet(),
DefaultInputTargetsSelector(emptySet(), parseCommonizerTarget("()") as SharedCommonizerTarget)
selectInputTargets(emptySet(), parseCommonizerTarget("()") as SharedCommonizerTarget)
)
}
@@ -96,7 +96,7 @@ class DefaultInputTargetsSelectorTest {
fun `single leaf outputTarget`() {
assertEquals(
setOf(LeafCommonizerTarget("a")),
DefaultInputTargetsSelector(setOf(LeafCommonizerTarget("a")), parseCommonizerTarget("(a)") as SharedCommonizerTarget)
selectInputTargets(setOf(LeafCommonizerTarget("a")), parseCommonizerTarget("(a)") as SharedCommonizerTarget)
)
}
@@ -104,10 +104,10 @@ class DefaultInputTargetsSelectorTest {
fun `exact output available`() {
assertEquals(
setOf(parseCommonizerTarget("(a, b)"), parseCommonizerTarget("(c, d)")),
DefaultInputTargetsSelector(
selectInputTargets(
setOf("a", "b", "c", "d", "(a, b)", "(c, d)", "(a, b, c, d)").map(::parseCommonizerTarget).toSet(),
parseCommonizerTarget("(a, b, c, d)") as SharedCommonizerTarget
)
)
}
}
}