[Commonizer] move commonizer setting keys to the commonizer-cli module

Get rid of `OptionAlias` as unnecessary; keys will be used directly
This commit is contained in:
Pavel Kirpichenkov
2022-01-26 20:47:12 +03:00
parent b17737d7de
commit a220624769
25 changed files with 83 additions and 100 deletions
@@ -6,16 +6,12 @@
package org.jetbrains.kotlin.gradle.targets.native.internal package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.OutputDirectory
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.base64Hash import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.base64Hash
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.ensureMaxFileNameLength import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.ensureMaxFileNameLength
import org.jetbrains.kotlin.commonizer.AdditionalCommonizerSetting
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS
import org.jetbrains.kotlin.commonizer.identityString import org.jetbrains.kotlin.commonizer.identityString
import org.jetbrains.kotlin.commonizer.setTo
import org.jetbrains.kotlin.gradle.utils.outputFilesProvider import org.jetbrains.kotlin.gradle.utils.outputFilesProvider
import java.io.File import java.io.File
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.commonizer.AdditionalCommonizerSetting import org.jetbrains.kotlin.commonizer.AdditionalCommonizerSetting
import org.jetbrains.kotlin.commonizer.CommonizerLogLevel import org.jetbrains.kotlin.commonizer.CommonizerLogLevel
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS import org.jetbrains.kotlin.commonizer.OptimisticNumberCommonizationEnabledKey
import org.jetbrains.kotlin.commonizer.setTo import org.jetbrains.kotlin.commonizer.setTo
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
@@ -22,7 +22,7 @@ internal val Project.commonizerLogLevel: CommonizerLogLevel
return if (logger.isInfoEnabled) CommonizerLogLevel.Info else CommonizerLogLevel.Quiet return if (logger.isInfoEnabled) CommonizerLogLevel.Info else CommonizerLogLevel.Quiet
} }
internal val Project.additionalCommonizerSettings: List<AdditionalCommonizerSetting> internal val Project.additionalCommonizerSettings: List<AdditionalCommonizerSetting<*>>
get() = listOf( get() = listOf(
OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS setTo isOptimisticNumberCommonizationEnabled OptimisticNumberCommonizationEnabledKey setTo isOptimisticNumberCommonizationEnabled
) )
@@ -27,7 +27,7 @@ internal class NativeDistributionCommonizationCache(
outputDirectory: File, outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>, outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel, logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>, additionalSettings: List<AdditionalCommonizerSetting<*>>,
) { ) {
if (!project.isNativeDistributionCommonizationCacheEnabled) { if (!project.isNativeDistributionCommonizationCacheEnabled) {
logInfo("Cache disabled") logInfo("Cache disabled")
@@ -29,21 +29,21 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
outputTargets: Set<SharedCommonizerTarget>, outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File, outputDirectory: File,
logLevel: CommonizerLogLevel, logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>, additionalSettings: List<AdditionalCommonizerSetting<*>>,
) { ) {
if (inputLibraries.isEmpty()) return if (inputLibraries.isEmpty()) return
val arguments = mutableListOf<String>().apply { val arguments = mutableListOf<String>().apply {
add("native-klib-commonize") add("native-klib-commonize")
add(NATIVE_DISTRIBUTION_OPTION_ALIAS.argumentString); add(konanHome.absolutePath) add("-$NATIVE_DISTRIBUTION_PATH_ALIAS"); add(konanHome.absolutePath)
add(INPUT_LIBRARIES_OPTION_ALIAS.argumentString); add(inputLibraries.joinToString(";") { it.absolutePath }) add("-$INPUT_LIBRARIES_ALIAS"); add(inputLibraries.joinToString(";") { it.absolutePath })
add(OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS.argumentString); add(outputTargets.joinToString(";") { it.identityString }) add("-$OUTPUT_COMMONIZER_TARGETS_ALIAS"); add(outputTargets.joinToString(";") { it.identityString })
add(OUTPUT_OPTION_ALIAS.argumentString); add(outputDirectory.absolutePath) add("-$OUTPUT_PATH_ALIAS"); add(outputDirectory.absolutePath)
if (dependencyLibraries.isNotEmpty()) { if (dependencyLibraries.isNotEmpty()) {
add(DEPENDENCY_LIBRARIES_OPTION_ALIAS.argumentString); add(dependencyLibraries.joinToString(";")) add("-$DEPENDENCY_LIBRARIES_ALIAS"); add(dependencyLibraries.joinToString(";"))
} }
add(LOG_LEVEL_OPTION_ALIAS.argumentString); add(logLevel.name.lowercase()) add("-$LOG_LEVEL_ALIAS"); add(logLevel.name.lowercase())
for ((settingArgument, settingValue) in additionalSettings) { for ((settingKey, settingValue) in additionalSettings) {
add(settingArgument); add(settingValue.toString()) add("-${settingKey.alias}"); add(settingValue.toString())
} }
} }
executor(arguments) executor(arguments)
@@ -54,16 +54,16 @@ public class CliCommonizer(private val executor: Executor) : NativeDistributionC
outputDirectory: File, outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>, outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel, logLevel: CommonizerLogLevel,
additionalSettings: List<AdditionalCommonizerSetting>, additionalSettings: List<AdditionalCommonizerSetting<*>>,
) { ) {
val arguments = mutableListOf<String>().apply { val arguments = mutableListOf<String>().apply {
add("native-dist-commonize") add("native-dist-commonize")
add(NATIVE_DISTRIBUTION_OPTION_ALIAS.argumentString); add(konanHome.absolutePath) add("-$NATIVE_DISTRIBUTION_PATH_ALIAS"); add(konanHome.absolutePath)
add(OUTPUT_OPTION_ALIAS.argumentString); add(outputDirectory.absolutePath) add("-$OUTPUT_PATH_ALIAS"); add(outputDirectory.absolutePath)
add(OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS.argumentString); add(outputTargets.joinToString(";") { it.identityString }) add("-$OUTPUT_COMMONIZER_TARGETS_ALIAS"); add(outputTargets.joinToString(";") { it.identityString })
add(LOG_LEVEL_OPTION_ALIAS.argumentString); add(logLevel.name.lowercase()) add("-$LOG_LEVEL_ALIAS"); add(logLevel.name.lowercase())
for ((settingArgument, settingValue) in additionalSettings) { for ((settingKey, settingValue) in additionalSettings) {
add(settingArgument); add(settingValue.toString()) add("-${settingKey.alias}"); add(settingValue.toString())
} }
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.commonizer package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.cli.OptionAlias
import java.io.File import java.io.File
import java.io.Serializable import java.io.Serializable
@@ -18,7 +17,7 @@ public interface CInteropCommonizer : Serializable {
outputTargets: Set<SharedCommonizerTarget>, outputTargets: Set<SharedCommonizerTarget>,
outputDirectory: File, outputDirectory: File,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet, logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(), additionalSettings: List<AdditionalCommonizerSetting<*>> = emptyList(),
) )
} }
@@ -29,14 +28,14 @@ public interface NativeDistributionCommonizer : Serializable {
outputDirectory: File, outputDirectory: File,
outputTargets: Set<SharedCommonizerTarget>, outputTargets: Set<SharedCommonizerTarget>,
logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet, logLevel: CommonizerLogLevel = CommonizerLogLevel.Quiet,
additionalSettings: List<AdditionalCommonizerSetting> = emptyList(), additionalSettings: List<AdditionalCommonizerSetting<*>> = emptyList(),
) )
} }
public data class AdditionalCommonizerSetting( public data class AdditionalCommonizerSetting<T : Any>(
public val key: String, public val key: CommonizerSettings.Key<T>,
public val value: Any, public val value: T,
) )
public infix fun OptionAlias.setTo(settingValue: Any): AdditionalCommonizerSetting = public infix fun <T : Any> CommonizerSettings.Key<T>.setTo(settingValue: T): AdditionalCommonizerSetting<T> =
AdditionalCommonizerSetting(this.argumentString, settingValue) AdditionalCommonizerSetting(this, settingValue)
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.cli.OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS
public interface CommonizerSettings {
public sealed class Key<T : Any> {
public abstract val defaultValue: T
public abstract val alias: String
}
public fun <T : Any> getSetting(key: Key<T>): T
}
public object OptimisticNumberCommonizationEnabledKey : CommonizerSettings.Key<Boolean>() {
override val defaultValue: Boolean = true
override val alias: String
get() = OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS
}
@@ -7,37 +7,16 @@ package org.jetbrains.kotlin.commonizer.cli
// General // General
private const val DEPENDENCY_LIBRARIES_ALIAS: String = "dependency-libraries" public const val DEPENDENCY_LIBRARIES_ALIAS: String = "dependency-libraries"
private const val INPUT_LIBRARIES_ALIAS: String = "input-libraries" public const val INPUT_LIBRARIES_ALIAS: String = "input-libraries"
private const val LOG_LEVEL_ALIAS: String = "log-level" public const val LOG_LEVEL_ALIAS: String = "log-level"
private const val NATIVE_DISTRIBUTION_PATH_ALIAS: String = "distribution-path" public const val NATIVE_DISTRIBUTION_PATH_ALIAS: String = "distribution-path"
private const val OUTPUT_COMMONIZER_TARGETS_ALIAS: String = "output-targets" public const val OUTPUT_COMMONIZER_TARGETS_ALIAS: String = "output-targets"
private const val OUTPUT_PATH_ALIAS: String = "output-path" public const val OUTPUT_PATH_ALIAS: String = "output-path"
private const val STATS_TYPE_ALIAS: String = "log-stats" public const val STATS_TYPE_ALIAS: String = "log-stats"
private const val NATIVE_TARGETS_ALIAS: String = "targets" public const val NATIVE_TARGETS_ALIAS: String = "targets"
private const val COPY_STDLIB_ALIAS: String = "copy-stdlib" public const val COPY_STDLIB_ALIAS: String = "copy-stdlib"
private const val COPY_ENDORSED_LIBS_ALIAS: String = "copy-endorsed-libs" public const val COPY_ENDORSED_LIBS_ALIAS: String = "copy-endorsed-libs"
public val DEPENDENCY_LIBRARIES_OPTION_ALIAS: OptionAlias = OptionAlias(DEPENDENCY_LIBRARIES_ALIAS)
public val INPUT_LIBRARIES_OPTION_ALIAS: OptionAlias = OptionAlias(INPUT_LIBRARIES_ALIAS)
public val LOG_LEVEL_OPTION_ALIAS: OptionAlias = OptionAlias(LOG_LEVEL_ALIAS)
public val NATIVE_DISTRIBUTION_OPTION_ALIAS: OptionAlias = OptionAlias(NATIVE_DISTRIBUTION_PATH_ALIAS)
public val OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS: OptionAlias = OptionAlias(OUTPUT_COMMONIZER_TARGETS_ALIAS)
public val OUTPUT_OPTION_ALIAS: OptionAlias = OptionAlias(OUTPUT_PATH_ALIAS)
public val STATS_TYPE_OPTION_ALIAS: OptionAlias = OptionAlias(STATS_TYPE_ALIAS)
public val NATIVE_TARGETS_OPTION_ALIAS: OptionAlias = OptionAlias(NATIVE_TARGETS_ALIAS)
public val COPY_STDLIB_OPTION_ALIAS: OptionAlias = OptionAlias(COPY_STDLIB_ALIAS)
public val COPY_ENDORSED_LIBS_OPTION_ALIAS: OptionAlias = OptionAlias(COPY_ENDORSED_LIBS_ALIAS)
// Commonizer settings // Commonizer settings
private const val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS: String = "optimistic-numbers" public const val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS: String = "optimistic-numbers"
public val OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS: OptionAlias = OptionAlias(OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_ALIAS)
@JvmInline
public value class OptionAlias(public val aliasString: String) {
public val argumentString: String
get() = "-$aliasString"
override fun toString(): String = aliasString
}
@@ -5,19 +5,6 @@
package org.jetbrains.kotlin.commonizer package org.jetbrains.kotlin.commonizer
interface CommonizerSettings {
sealed class Key<T : Any> {
abstract val defaultValue: T
}
fun <T : Any> getSetting(key: Key<T>): T
}
object OptimisticNumberCommonizationEnabledKey : CommonizerSettings.Key<Boolean>() {
override val defaultValue: Boolean = true
}
internal object DefaultCommonizerSettings : CommonizerSettings { internal object DefaultCommonizerSettings : CommonizerSettings {
override fun <T : Any> getSetting(key: CommonizerSettings.Key<T>): T { override fun <T : Any> getSetting(key: CommonizerSettings.Key<T>): T {
return key.defaultValue return key.defaultValue
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.commonizer.cli package org.jetbrains.kotlin.commonizer.cli
internal class BooleanOptionType( internal class BooleanOptionType(
alias: OptionAlias, alias: String,
description: String, description: String,
mandatory: Boolean mandatory: Boolean
) : OptionType<Boolean>(alias, description, mandatory) { ) : OptionType<Boolean>(alias, description, mandatory) {
@@ -8,11 +8,10 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.CommonizerSettings import org.jetbrains.kotlin.commonizer.CommonizerSettings
internal sealed class CommonizerSettingOptionType<T : Any>( internal sealed class CommonizerSettingOptionType<T : Any>(
alias: OptionAlias, val commonizerSettingKey: CommonizerSettings.Key<T>,
description: String, description: String,
val commonizerSettingKey: CommonizerSettings.Key<T>
) : OptionType<T>( ) : OptionType<T>(
alias, commonizerSettingKey.alias,
description, description,
mandatory = false, mandatory = false,
) )
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.commonizer.parseCommonizerDependency
internal abstract class DependenciesLibrariesSetOptionType( internal abstract class DependenciesLibrariesSetOptionType(
mandatory: Boolean, mandatory: Boolean,
alias: OptionAlias, alias: String,
description: String description: String
) : OptionType<List<CommonizerDependency>>( ) : OptionType<List<CommonizerDependency>>(
mandatory = mandatory, mandatory = mandatory,
@@ -7,6 +7,6 @@ package org.jetbrains.kotlin.commonizer.cli
internal object DependencyLibrariesOptionType : DependenciesLibrariesSetOptionType( internal object DependencyLibrariesOptionType : DependenciesLibrariesSetOptionType(
mandatory = false, mandatory = false,
alias = DEPENDENCY_LIBRARIES_OPTION_ALIAS, alias = DEPENDENCY_LIBRARIES_ALIAS,
description = "';' separated list of klib file paths that can be used as dependency" description = "';' separated list of klib file paths that can be used as dependency"
) )
@@ -7,6 +7,6 @@ package org.jetbrains.kotlin.commonizer.cli
internal object InputLibrariesOptionType : LibrariesSetOptionType( internal object InputLibrariesOptionType : LibrariesSetOptionType(
mandatory = true, mandatory = true,
alias = INPUT_LIBRARIES_OPTION_ALIAS, alias = INPUT_LIBRARIES_ALIAS,
description = "';' separated list of klib file paths that will get commonized" description = "';' separated list of klib file paths that will get commonized"
) )
@@ -9,7 +9,7 @@ import java.io.File
internal abstract class LibrariesSetOptionType( internal abstract class LibrariesSetOptionType(
mandatory: Boolean, mandatory: Boolean,
alias: OptionAlias, alias: String,
description: String description: String
) : OptionType<List<File>>( ) : OptionType<List<File>>(
mandatory = mandatory, mandatory = mandatory,
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.CommonizerLogLevel import org.jetbrains.kotlin.commonizer.CommonizerLogLevel
internal object LogLevelOptionType : OptionType<CommonizerLogLevel>(LOG_LEVEL_OPTION_ALIAS, "{quiet, info}", false) { internal object LogLevelOptionType : OptionType<CommonizerLogLevel>(LOG_LEVEL_ALIAS, "{quiet, info}", false) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<CommonizerLogLevel> { override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<CommonizerLogLevel> {
return when (rawValue.lowercase().trim()) { return when (rawValue.lowercase().trim()) {
"quiet" -> Option(this, CommonizerLogLevel.Quiet) "quiet" -> Option(this, CommonizerLogLevel.Quiet)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import java.io.File import java.io.File
internal object NativeDistributionOptionType : OptionType<File>(NATIVE_DISTRIBUTION_OPTION_ALIAS, "Path to the Kotlin/Native distribution") { internal object NativeDistributionOptionType : OptionType<File>(NATIVE_DISTRIBUTION_PATH_ALIAS, "Path to the Kotlin/Native distribution") {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> { override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> {
val file = File(rawValue) val file = File(rawValue)
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.KonanTarget.Companion.predefinedTargets import org.jetbrains.kotlin.konan.target.KonanTarget.Companion.predefinedTargets
internal object NativeTargetsOptionType : OptionType<List<KonanTarget>>( internal object NativeTargetsOptionType : OptionType<List<KonanTarget>>(
NATIVE_TARGETS_OPTION_ALIAS, "Comma-separated list of hardware targets", mandatory = false NATIVE_TARGETS_ALIAS, "Comma-separated list of hardware targets", mandatory = false
) { ) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<List<KonanTarget>> { override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<List<KonanTarget>> {
val targetNames = rawValue.split(',') val targetNames = rawValue.split(',')
@@ -8,9 +8,8 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.OptimisticNumberCommonizationEnabledKey import org.jetbrains.kotlin.commonizer.OptimisticNumberCommonizationEnabledKey
internal object OptimisticNumberCommonizationOptionType : CommonizerSettingOptionType<Boolean>( internal object OptimisticNumberCommonizationOptionType : CommonizerSettingOptionType<Boolean>(
OPTIMISTIC_NUMBER_COMMONIZATION_ENABLED_OPTION_ALIAS,
"Boolean (default true)\nEnable commonization of integer types with different bit width to the most narrow among them",
OptimisticNumberCommonizationEnabledKey, OptimisticNumberCommonizationEnabledKey,
"Boolean (default true)\nEnable commonization of integer types with different bit width to the most narrow among them",
) { ) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<Boolean> = override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<Boolean> =
Option(this, parseBoolean(rawValue, onError)) Option(this, parseBoolean(rawValue, onError))
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.commonizer.cli package org.jetbrains.kotlin.commonizer.cli
internal abstract class OptionType<T>( internal abstract class OptionType<T>(
val alias: OptionAlias, val alias: String,
val description: String, val description: String,
val mandatory: Boolean = true val mandatory: Boolean = true
) { ) {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.parseCommonizerTarget import org.jetbrains.kotlin.commonizer.parseCommonizerTarget
internal object OutputCommonizerTargetsOptionType : OptionType<Set<SharedCommonizerTarget>>( internal object OutputCommonizerTargetsOptionType : OptionType<Set<SharedCommonizerTarget>>(
alias = OUTPUT_COMMONIZER_TARGET_OPTION_ALIAS, alias = OUTPUT_COMMONIZER_TARGETS_ALIAS,
description = "All output targets separated with ';'", description = "All output targets separated with ';'",
mandatory = true mandatory = true
) { ) {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import java.io.File import java.io.File
internal object OutputOptionType : OptionType<File>(OUTPUT_OPTION_ALIAS, "Destination for commonized libraries") { internal object OutputOptionType : OptionType<File>(OUTPUT_PATH_ALIAS, "Destination for commonized libraries") {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> { override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<File> {
val file = File(rawValue) val file = File(rawValue)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.commonizer.stats.StatsType import org.jetbrains.kotlin.commonizer.stats.StatsType
internal object StatsTypeOptionType : OptionType<StatsType>(STATS_TYPE_OPTION_ALIAS, DESCRIPTION, mandatory = false) { internal object StatsTypeOptionType : OptionType<StatsType>(STATS_TYPE_ALIAS, DESCRIPTION, mandatory = false) {
override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<StatsType> { override fun parse(rawValue: String, onError: (reason: String) -> Nothing): Option<StatsType> {
val value = StatsType.values().firstOrNull { it.name.equals(rawValue, ignoreCase = true) } val value = StatsType.values().firstOrNull { it.name.equals(rawValue, ignoreCase = true) }
?: onError("Invalid stats type: $rawValue") ?: onError("Invalid stats type: $rawValue")
@@ -30,7 +30,7 @@ internal abstract class Task(private val options: Collection<Option<*>>) : Compa
abstract fun execute(logPrefix: String = "") abstract fun execute(logPrefix: String = "")
protected inline fun <reified T, reified O : OptionType<T>> getMandatory(nameFilter: (String) -> Boolean = { true }): T { protected inline fun <reified T, reified O : OptionType<T>> getMandatory(nameFilter: (String) -> Boolean = { true }): T {
val option = options.filter { it.type is O }.single { nameFilter(it.type.alias.aliasString) } val option = options.filter { it.type is O }.single { nameFilter(it.type.alias) }
check(option.type.mandatory) check(option.type.mandatory)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -38,7 +38,7 @@ internal abstract class Task(private val options: Collection<Option<*>>) : Compa
} }
internal inline fun <reified T, reified O : OptionType<T>> getOptional(nameFilter: (String) -> Boolean = { true }): T? { internal inline fun <reified T, reified O : OptionType<T>> getOptional(nameFilter: (String) -> Boolean = { true }): T? {
val option = options.filter { it.type is O }.singleOrNull { nameFilter(it.type.alias.aliasString) } val option = options.filter { it.type is O }.singleOrNull { nameFilter(it.type.alias) }
if (option != null) check(!option.type.mandatory) if (option != null) check(!option.type.mandatory)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -20,12 +20,12 @@ internal enum class TaskType(
NativeTargetsOptionType, NativeTargetsOptionType,
OutputCommonizerTargetsOptionType, OutputCommonizerTargetsOptionType,
BooleanOptionType( BooleanOptionType(
COPY_STDLIB_OPTION_ALIAS, COPY_STDLIB_ALIAS,
"Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination", "Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination",
mandatory = false mandatory = false
), ),
BooleanOptionType( BooleanOptionType(
COPY_ENDORSED_LIBS_OPTION_ALIAS, COPY_ENDORSED_LIBS_ALIAS,
"Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination", "Boolean (default false);\nwhether to copy Kotlin/Native endorsed libraries to the destination",
mandatory = false mandatory = false
), ),
@@ -46,7 +46,7 @@ private fun parseTask(
tasks: MutableList<Task> tasks: MutableList<Task>
): String? { ): String? {
val taskType = TaskType.getByAlias(taskAlias) ?: printUsageAndExit("Unknown task $taskAlias") val taskType = TaskType.getByAlias(taskAlias) ?: printUsageAndExit("Unknown task $taskAlias")
val optionTypes = taskType.optionTypes.associateBy { it.alias.aliasString } val optionTypes = taskType.optionTypes.associateBy { it.alias }
val options = mutableMapOf<String, Option<*>>() val options = mutableMapOf<String, Option<*>>()
fun buildOngoingTask() { fun buildOngoingTask() {
@@ -117,7 +117,7 @@ private fun printUsageAndExit(errorMessage: String? = null): Nothing {
println(formatLeft(1, if (taskType.optionTypes.isNotEmpty()) "Options:" else "No options.")) println(formatLeft(1, if (taskType.optionTypes.isNotEmpty()) "Options:" else "No options."))
for (optionType in taskType.optionTypes) { for (optionType in taskType.optionTypes) {
val lines = optionType.description.split('\n') val lines = optionType.description.split('\n')
println(formatBoth(2, "-${optionType.alias.aliasString}", lines.first())) println(formatBoth(2, "-${optionType.alias}", lines.first()))
lines.drop(1).forEach { println(StringBuilder().formatRight(it)) } lines.drop(1).forEach { println(StringBuilder().formatRight(it)) }
} }
println() println()