| // WITH_REFLECT |
| // TARGET_BACKEND: JVM |
| // FILE: 1.kt |
| package test |
| |
| open class TypeRef<T> { |
| val type = target() |
| |
| private fun target(): String { |
| val thisClass = this.javaClass |
| val superClass = thisClass.genericSuperclass |
| |
| return superClass.toString() |
| } |
| } |
| |
| |
| |
| inline fun <reified T> typeWithMessage(message: String = "Hello"): String { |
| val type = object : TypeRef<T>() {} |
| val target = type.type |
| |
| return message + " " + target |
| } |
| |
| // FILE: 2.kt |
| |
| import test.* |
| |
| fun specifyOptionalArgument() = typeWithMessage<List<Int>>("Hello") |
| |
| fun useDefault() = typeWithMessage<List<Int>>() |
| |
| fun box(): String { |
| val specifyOptionalArgument = specifyOptionalArgument() |
| val useDefault = useDefault() |
| |
| if (useDefault != specifyOptionalArgument) return "fail: $useDefault != $specifyOptionalArgument" |
| |
| val type = typeWithMessage<List<Int>>("") |
| if (type != " test.TypeRef<java.util.List<? extends java.lang.Integer>>") return "fail 2: $type" |
| |
| return "OK" |
| } |