[PL] Change semantics of CLI parameter -Xpartial-linkage

This parameter accepts the name of the "mode" in which the partial linkage would work. Currently, only two options are supported: 'enable', 'disable'. But the list may be extended in the future as needed.

At the moment the 'disable' option is the default one. This will be changed in #KT-51447, #KT-51443.
This commit is contained in:
Dmitriy Dolovov
2023-03-29 19:43:40 +02:00
committed by Space Team
parent a450866db3
commit 46ed6e5766
8 changed files with 50 additions and 18 deletions
@@ -8,33 +8,54 @@ package org.jetbrains.kotlin.ir.linkage.partial
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
data class PartialLinkageConfig(val isEnabled: Boolean, val logLevel: PartialLinkageLogLevel) {
data class PartialLinkageConfig(val mode: PartialLinkageMode, val logLevel: PartialLinkageLogLevel) {
val isEnabled get() = mode.isEnabled
companion object {
val DEFAULT = PartialLinkageConfig(false, PartialLinkageLogLevel.ERROR)
val DEFAULT = PartialLinkageConfig(PartialLinkageMode.DEFAULT, PartialLinkageLogLevel.ERROR)
val KEY = CompilerConfigurationKey.create<PartialLinkageConfig>("partial linkage configuration")
}
}
// In the future the set of supported modes can be extended.
enum class PartialLinkageMode(val isEnabled: Boolean) {
ENABLE(isEnabled = true), DISABLE(isEnabled = false);
companion object {
val DEFAULT = DISABLE // TODO: should be changed to `ENABLE` (KT-51447, KT-51443)
fun resolveMode(key: String): PartialLinkageMode? =
values().firstOrNull { entry -> key == entry.name.lowercase() }
}
}
enum class PartialLinkageLogLevel {
INFO, WARNING, ERROR;
companion object {
val DEFAULT = WARNING
fun resolveLogLevel(key: String): PartialLinkageLogLevel =
fun resolveLogLevel(key: String): PartialLinkageLogLevel? =
values().firstOrNull { entry -> entry.name.equals(key, ignoreCase = true) }
?: error("Unknown partial linkage compile-time log level '$key'")
}
}
val CompilerConfiguration.partialLinkageConfig: PartialLinkageConfig
get() = this[PartialLinkageConfig.KEY] ?: PartialLinkageConfig.DEFAULT
fun CompilerConfiguration.setupPartialLinkageConfig(isEnabled: Boolean, logLevel: String?) {
setupPartialLinkageConfig(
PartialLinkageConfig(isEnabled, logLevel?.let(PartialLinkageLogLevel::resolveLogLevel) ?: PartialLinkageLogLevel.DEFAULT)
)
inline fun CompilerConfiguration.setupPartialLinkageConfig(mode: String?, logLevel: String?, onError: (String) -> Unit) {
val resolvedMode = if (mode != null)
PartialLinkageMode.resolveMode(mode) ?: return onError("Unknown partial linkage mode '$mode'")
else
PartialLinkageMode.DEFAULT
val resolvedLogLevel = if (logLevel != null)
PartialLinkageLogLevel.resolveLogLevel(logLevel) ?: return onError("Unknown partial linkage compile-time log level '$logLevel'")
else
PartialLinkageLogLevel.DEFAULT
setupPartialLinkageConfig(PartialLinkageConfig(resolvedMode, resolvedLogLevel))
}
fun CompilerConfiguration.setupPartialLinkageConfig(config: PartialLinkageConfig) {