package usage.test import java.io.Serializable import kotlin.reflect.full.createInstance import kotlin.reflect.full.superclasses import kotlin.reflect.jvm.javaMethod import kotlin.reflect.jvm.kotlinFunction typealias TA = List open class B { fun inherited(): C? = null } class C : B() { fun function(s: S): TA = listOf(s) var property: Int? = 42 fun String.extensionFunction(): Int = length val U.extensionProperty: Unit get() = Unit } fun box(): String { val members = C::class.members.joinToString("\n") if (members != """ var usage.test.C.property: kotlin.Int? val usage.test.C.(U.)extensionProperty: kotlin.Unit fun usage.test.C.function(S): usage.test.TA /* = kotlin.collections.List */ fun usage.test.C.(kotlin.String.)extensionFunction(): kotlin.Int fun usage.test.C.equals(kotlin.Any?): kotlin.Boolean fun usage.test.C.hashCode(): kotlin.Int fun usage.test.C.inherited(): usage.test.C? fun usage.test.C.toString(): kotlin.String """.trimIndent()) return "Fail members toString: $members" val c = C::class.createInstance() c.property = 239 val callResult = (C<*>::property).call(c) if (callResult != 239) return "Fail call: $callResult" val stringSuperclasses = String::class.superclasses if (stringSuperclasses != listOf(Comparable::class, CharSequence::class, Serializable::class, Any::class)) return "Fail superclasses: $stringSuperclasses" val function = B::inherited val javaMethod = function.javaMethod!! val kotlinFunction = javaMethod.kotlinFunction!! if (function != kotlinFunction) return "Fail javaMethod/kotlinFunction:\nfunction=$function\njavaMethod=$javaMethod\nkotlinFunction=$kotlinFunction" return "OK" } fun main() { println(box()) }