[Commonizer] Allow empty SharedCommonizerTarget

This commit is contained in:
sebastian.sellmair
2021-03-24 17:38:13 +01:00
parent cdbede09df
commit 79c6b406ba
4 changed files with 17 additions and 22 deletions

View File

@@ -34,10 +34,6 @@ public data class SharedCommonizerTarget(val targets: Set<CommonizerTarget>) : C
return if (targets.isNotEmpty()) SharedCommonizerTarget(targets) else null
}
}
init {
require(targets.isNotEmpty()) { "Empty 'SharedCommonizerTarget': Expected at least one target" }
}
}
public fun CommonizerTarget(konanTargets: Iterable<KonanTarget>): CommonizerTarget {
@@ -101,6 +97,6 @@ public val CommonizerTarget.level: Int
get() {
return when (this) {
is LeafCommonizerTarget -> return 0
is SharedCommonizerTarget -> targets.maxOf { it.level } + 1
is SharedCommonizerTarget -> if (targets.isNotEmpty()) targets.maxOf { it.level } + 1 else 0
}
}

View File

@@ -46,8 +46,8 @@ private sealed class IdentityStringToken {
return when (this) {
is Word -> value
is Separator -> ", "
is SharedTargetStart -> "["
is SharedTargetEnd -> "]"
is SharedTargetStart -> "("
is SharedTargetEnd -> ")"
}
}
}
@@ -118,11 +118,11 @@ private data class AnyOfParser<T : Any>(val parsers: List<Parser<T>>) : Parser<T
}
}
private fun <T : Any> Parser<T>.oneOrMore(): Parser<List<T>> {
return OneOrMoreParser(this)
private fun <T : Any> Parser<T>.zeroOrMore(): Parser<List<T>> {
return ZeroOrMoreParser(this)
}
private data class OneOrMoreParser<T : Any>(val parser: Parser<T>) : Parser<List<T>> {
private data class ZeroOrMoreParser<T : Any>(val parser: Parser<T>) : Parser<List<T>> {
override fun invoke(tokens: List<IdentityStringToken>): ParserOutput<List<T>>? {
val outputs = mutableListOf<T>()
var remainingTokens = tokens
@@ -132,9 +132,6 @@ private data class OneOrMoreParser<T : Any>(val parser: Parser<T>) : Parser<List
outputs.add(output.value)
remainingTokens = output.remaining
}
if (outputs.isEmpty()) {
return null
}
return ParserOutput(outputs.toList(), remainingTokens)
}
}
@@ -162,12 +159,12 @@ private object SharedTargetParser : Parser<SharedTargetSyntaxNode> {
override fun invoke(tokens: List<IdentityStringToken>): ParserOutput<SharedTargetSyntaxNode>? {
if (tokens.firstOrNull() !is SharedTargetStart) return null
val innerParser = anyOf(LeafTargetParser, SharedTargetParser).ignore(Separator).oneOrMore()
val innerParser = anyOf(LeafTargetParser, SharedTargetParser).ignore(Separator).zeroOrMore()
val innerParserOutput = innerParser(tokens.drop(1)) ?: return null
val closingToken = innerParserOutput.remaining.firstOrNull()
if (closingToken != SharedTargetEnd) {
error("Missing ']' at ${tokens.joinToString("")}")
error("Missing '${SharedTargetEnd}' at ${tokens.joinToString("")}")
}
return ParserOutput(SharedTargetSyntaxNode(innerParserOutput.value), innerParserOutput.remaining.drop(1))

View File

@@ -85,6 +85,11 @@ class CommonizerTargetIdentityStringTest {
)
}
@Test
fun `empty shared target`() {
assertEquals(SharedCommonizerTarget(emptySet<CommonizerTarget>()), parseCommonizerTarget("()"))
}
@Test(expected = IllegalArgumentException::class)
fun `fail parsing CommonizerTarget 1`() {
parseCommonizerTarget("xxx,")
@@ -95,11 +100,6 @@ class CommonizerTargetIdentityStringTest {
parseCommonizerTarget("")
}
@Test(expected = IllegalArgumentException::class)
fun `fail parsing CommonizerTarget 3`() {
parseCommonizerTarget("()")
}
@Test(expected = IllegalArgumentException::class)
fun `fail parsing CommonizerTarget 4`() {
parseCommonizerTarget("(xxx")

View File

@@ -72,9 +72,11 @@ class CommonizerTargetPrettyNameTest {
)
}
@Test(expected = IllegalArgumentException::class)
@Test
fun sharedTargetNoInnerTargets() {
SharedCommonizerTarget(emptySet<CommonizerTarget>())
assertEquals(
"[]", SharedCommonizerTarget(emptySet<CommonizerTarget>()).prettyName
)
}
private companion object {