blob: 1565e6755fa3c5863b7579a2d8a1ca4800536294 [file]
// LANGUAGE: +CompanionBlocks +CompanionExtensions
// WITH_STDLIB
@file:OptIn(ExperimentalVersionOverloading::class)
class GenericConstructor<T>(
val value: T,
@IntroducedAt("1") val fallback: T = value,
)
class GenericOwner<T>(private val defaultValue: T) {
fun member(@IntroducedAt("1") fallback: T = defaultValue): T = fallback
fun String.extension(@IntroducedAt("1") fallback: T = defaultValue): String = "$this/$fallback"
}
fun <K, V> genericPair(
key: K,
value: V,
@IntroducedAt("1") pair: Pair<K, V> = Pair(key, value),
): String = "${pair.first}${pair.second}"
fun <T> genericLambda(
value: T,
@IntroducedAt("1") transform: (T) -> String = { it.toString() },
): String = transform(value)
inline fun <reified T> reifiedDefault(
@IntroducedAt("1") value: T? = null,
): String = if (T::class == String::class) "String:$value" else "Other:$value"
class GenericOuter<T>(private val outerDefault: T) {
inner class Inner(
val value: T,
@IntroducedAt("1") val fallback: T = outerDefault,
)
}
class GenericCompanionOwner(val value: Any?, val fallback: Any?)
companion fun <T> GenericCompanionOwner.create(
value: T,
@IntroducedAt("1") fallback: T = value,
): GenericCompanionOwner = GenericCompanionOwner(value, fallback)
private var defaultEvaluationCount = 0
private fun nextDefaultValue(): Int {
defaultEvaluationCount += 1
return defaultEvaluationCount
}
fun sideEffectDefault(@IntroducedAt("1") value: Int = nextDefaultValue()): Int = value
fun box(): String {
val genericConstructor = GenericConstructor("O")
if (genericConstructor.value != "O" || genericConstructor.fallback != "O") return "fail1"
val genericOwner = GenericOwner("default")
if (genericOwner.member() != "default") return "fail2"
if (with(genericOwner) { "receiver".extension() } != "receiver/default") return "fail3"
if (genericPair("O", "K") != "OK") return "fail5"
if (genericLambda("OK") != "OK") return "fail6"
if (reifiedDefault<String>() != "String:null") return "fail7"
val genericInner = GenericOuter("outer").Inner("inner")
if (genericInner.value != "inner" || genericInner.fallback != "outer") return "fail8"
val genericCompanion = GenericCompanionOwner.create("OK")
if (genericCompanion.value != "OK" || genericCompanion.fallback != "OK") return "fail9"
if (sideEffectDefault() != 1 || defaultEvaluationCount != 1) return "fail10"
if (sideEffectDefault(42) != 42 || defaultEvaluationCount != 1) return "fail11"
return "OK"
}