[KLIB tool] Warn on unknown CLI options

This commit is contained in:
Dmitriy Dolovov
2023-11-16 12:59:27 +01:00
committed by Space Team
parent b1c9791404
commit ede77ea29c
@@ -90,8 +90,8 @@ fun printUsage() {
) )
} }
private fun parseArgs(args: Array<String>): Map<String, List<String>> { private fun parseOptions(args: Array<String>): Map<String, List<String>> {
val commandLine = mutableMapOf<String, MutableList<String>>() val options = mutableMapOf<String, MutableList<String>>()
for (index in args.indices step 2) { for (index in args.indices step 2) {
val key = args[index] val key = args[index]
if (key[0] != '-') { if (key[0] != '-') {
@@ -101,13 +101,13 @@ private fun parseArgs(args: Array<String>): Map<String, List<String>> {
throw IllegalArgumentException("Expected an value after $key") throw IllegalArgumentException("Expected an value after $key")
} }
val value = listOf(args[index + 1]) val value = listOf(args[index + 1])
commandLine[key]?.addAll(value) ?: commandLine.put(key, value.toMutableList()) options[key]?.addAll(value) ?: options.put(key, value.toMutableList())
} }
return commandLine return options
} }
class Command(args: Array<String>) { private class Command(args: Array<String>) {
init { init {
if (args.size < 2) { if (args.size < 2) {
printUsage() printUsage()
@@ -117,11 +117,21 @@ class Command(args: Array<String>) {
val verb = args[0] val verb = args[0]
val library = args[1] val library = args[1]
val options: Map<String, List<String>> = parseArgs(args.drop(2).toTypedArray())
val knownOptions: Map<KnownOption, List<String>> = parseOptions(args.drop(2).toTypedArray<String>())
.entries
.mapNotNull { (option, values) ->
val knownOption = KnownOption.parseOrNull(option)
if (knownOption == null) {
logWarning("Unrecognized command-line option: $option")
return@mapNotNull null
}
knownOption to values
}.toMap()
} }
private fun Command.parseSignatureVersion(): KotlinIrSignatureVersion? { private fun Command.parseSignatureVersion(): KotlinIrSignatureVersion? {
val rawSignatureVersion = options["-signature-version"]?.last() ?: return null val rawSignatureVersion = knownOptions[KnownOption.SIGNATURE_VERSION]?.last() ?: return null
val signatureVersion = rawSignatureVersion.toIntOrNull()?.let(::KotlinIrSignatureVersion) val signatureVersion = rawSignatureVersion.toIntOrNull()?.let(::KotlinIrSignatureVersion)
?: logError("Invalid signature version: $rawSignatureVersion") ?: logError("Invalid signature version: $rawSignatureVersion")
@@ -405,11 +415,21 @@ fun libraryInCurrentDir(name: String) = resolverByName(emptyList(), logger = Kli
fun libraryInRepoOrCurrentDir(repository: File, name: String) = fun libraryInRepoOrCurrentDir(repository: File, name: String) =
resolverByName(listOf(repository.absolutePath), logger = KlibToolLogger).resolve(name) resolverByName(listOf(repository.absolutePath), logger = KlibToolLogger).resolve(name)
private enum class KnownOption(val option: String) {
REPOSITORY("-repository"),
PRINT_SIGNATURES("-print-signatures"),
SIGNATURE_VERSION("-signature-version");
companion object {
fun parseOrNull(option: String): KnownOption? = values().firstOrNull { it.option == option }
}
}
fun main(args: Array<String>) { fun main(args: Array<String>) {
val command = Command(args) val command = Command(args)
val repository = command.options["-repository"]?.last() val repository = command.knownOptions[KnownOption.REPOSITORY]?.last()
val printSignatures = command.options["-print-signatures"]?.last()?.toBoolean() == true val printSignatures = command.knownOptions[KnownOption.PRINT_SIGNATURES]?.last()?.toBoolean() == true
val signatureVersion = command.parseSignatureVersion() val signatureVersion = command.parseSignatureVersion()