blob: 801dc2964715d65157f8922ab64163f6f25d6050 [file]
// TARGET_BACKEND: JVM
// WITH_STDLIB
// FILE: util.kt
package util
enum class E {
A, B
}
val globalE: E = E.A
inline fun fooInline(): Int = when (globalE) {
E.A -> 1
E.B -> 2
}
// FILE: test.kt
package test
import util.*
private const val SYNTHETIC_CLASS_VISIBILITY_SHIFT = 8
private const val SYNTHETIC_CLASS_VISIBILITY_MASK = 0b111
private const val LOCAL_VISIBILITY = 5
private const val PUBLIC_ABI_FLAG = 1 shl 7
fun test() = fooInline()
fun fooLocal(): Int = when (globalE) {
E.A -> 1
E.B -> 2
}
private fun metadataExtraInt(javaClass: Class<*>): Int =
javaClass.getAnnotation(Metadata::class.java).extraInt
private fun syntheticClassVisibility(javaClass: Class<*>): Int =
(metadataExtraInt(javaClass) shr SYNTHETIC_CLASS_VISIBILITY_SHIFT) and SYNTHETIC_CLASS_VISIBILITY_MASK
private fun isPublicAbi(javaClass: Class<*>): Boolean =
metadataExtraInt(javaClass) and PUBLIC_ABI_FLAG != 0
fun box(): String {
test()
val whenMappingsLocal = Class.forName("test.TestKt").declaredClasses.single { it.simpleName == "WhenMappings" }
val whenMappingsEscaped = Class.forName("util.UtilKt").declaredClasses.single { it.simpleName == "WhenMappings" }
var visibility = syntheticClassVisibility(whenMappingsLocal)
if (visibility != LOCAL_VISIBILITY) {
return "Fail: expected LOCAL visibility (5) for local WhenMappings, got $visibility"
}
if (isPublicAbi(whenMappingsLocal)) {
return "Fail: expected WhenMappings to not be public ABI"
}
visibility = syntheticClassVisibility(whenMappingsEscaped)
if (visibility != LOCAL_VISIBILITY) {
return "Fail: expected LOCAL visibility (5) for escaped WhenMappings, got $visibility"
}
if (!isPublicAbi(whenMappingsEscaped)) {
return "Fail: expected WhenMappings from public inline function to be public ABI"
}
return "OK"
}