mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
[Commonizer] Allow empty SharedCommonizerTarget
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -72,9 +72,11 @@ class CommonizerTargetPrettyNameTest {
|
||||
)
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException::class)
|
||||
@Test
|
||||
fun sharedTargetNoInnerTargets() {
|
||||
SharedCommonizerTarget(emptySet<CommonizerTarget>())
|
||||
assertEquals(
|
||||
"[]", SharedCommonizerTarget(emptySet<CommonizerTarget>()).prettyName
|
||||
)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
|
||||
Reference in New Issue
Block a user