From ede77ea29c8c64b5e8f6766039c05410e7247e43 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Thu, 16 Nov 2023 12:59:27 +0100 Subject: [PATCH] [KLIB tool] Warn on unknown CLI options --- .../org/jetbrains/kotlin/cli/klib/main.kt | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index 3ba4f49631d..891cea0079f 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -90,8 +90,8 @@ fun printUsage() { ) } -private fun parseArgs(args: Array): Map> { - val commandLine = mutableMapOf>() +private fun parseOptions(args: Array): Map> { + val options = mutableMapOf>() for (index in args.indices step 2) { val key = args[index] if (key[0] != '-') { @@ -101,13 +101,13 @@ private fun parseArgs(args: Array): Map> { throw IllegalArgumentException("Expected an value after $key") } 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) { +private class Command(args: Array) { init { if (args.size < 2) { printUsage() @@ -117,11 +117,21 @@ class Command(args: Array) { val verb = args[0] val library = args[1] - val options: Map> = parseArgs(args.drop(2).toTypedArray()) + + val knownOptions: Map> = parseOptions(args.drop(2).toTypedArray()) + .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? { - val rawSignatureVersion = options["-signature-version"]?.last() ?: return null + val rawSignatureVersion = knownOptions[KnownOption.SIGNATURE_VERSION]?.last() ?: return null val signatureVersion = rawSignatureVersion.toIntOrNull()?.let(::KotlinIrSignatureVersion) ?: logError("Invalid signature version: $rawSignatureVersion") @@ -405,11 +415,21 @@ fun libraryInCurrentDir(name: String) = resolverByName(emptyList(), logger = Kli fun libraryInRepoOrCurrentDir(repository: File, name: String) = 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) { val command = Command(args) - val repository = command.options["-repository"]?.last() - val printSignatures = command.options["-print-signatures"]?.last()?.toBoolean() == true + val repository = command.knownOptions[KnownOption.REPOSITORY]?.last() + val printSignatures = command.knownOptions[KnownOption.PRINT_SIGNATURES]?.last()?.toBoolean() == true val signatureVersion = command.parseSignatureVersion()