Type parameters mapping

#KT-10429 Fixed
This commit is contained in:
Michael Bogdanov
2015-12-23 14:47:05 +03:00
parent 5cdf170511
commit fee6d4f282
19 changed files with 312 additions and 73 deletions
@@ -0,0 +1,19 @@
// NO_CHECK_LAMBDA_INLINING
// FULL_JDK
import test.*
import java.util.*
fun box(): String {
val result = Test().callInline()
val method = result.javaClass.getMethod("aTest", Any::class.java)
val genericReturnType = method.genericReturnType
if (genericReturnType.toString() != "test.B<T>") return "fail 1: ${genericReturnType}"
val genericParameterTypes = method.genericParameterTypes
if (genericParameterTypes.size != 1) return "fail 2: ${genericParameterTypes.size}"
if (genericParameterTypes[0].toString() != "T") return "fail 3: ${genericParameterTypes[0]}"
return "OK"
}
@@ -0,0 +1,19 @@
package test
class B<T>
interface A {
fun <T> aTest(p: T): B<T>
}
open class Test {
inline fun <T> test(crossinline z: () -> Int) = object : A {
override fun <T> aTest(p: T): B<T> {
z()
return B<T>()
}
}
fun callInline() = test<String> { 1 }
}
@@ -0,0 +1,19 @@
// NO_CHECK_LAMBDA_INLINING
// FULL_JDK
import test.*
import java.util.*
fun box(): String {
val result = Test().callInline()
val method = result.javaClass.getMethod("aTest", Any::class.java)
val genericReturnType = method.genericReturnType
if (genericReturnType.toString() != "test.B<T>") return "fail 1: ${genericReturnType}"
val genericParameterTypes = method.genericParameterTypes
if (genericParameterTypes.size != 1) return "fail 2: ${genericParameterTypes.size}"
if (genericParameterTypes[0].toString() != "T") return "fail 3: ${genericParameterTypes[0]}"
return "OK"
}
@@ -0,0 +1,19 @@
package test
class B<T>
interface A {
fun <T> aTest(p: T): B<T>
}
open class Test {
inline fun <reified T> test(crossinline z: () -> Int) = object : A {
override fun <T> aTest(p: T): B<T> {
z()
return B<T>()
}
}
fun callInline() = test<String> { 1 }
}
@@ -0,0 +1,26 @@
//NO_CHECK_LAMBDA_INLINING
import test.*
import java.util.*
fun box(): String {
val comparable = CustomerService().comparator<String>()
val method = comparable.javaClass.getMethod("compare", Any::class.java, Any::class.java)
val genericParameterTypes = method.genericParameterTypes
if (genericParameterTypes.size != 2) return "fail 1: ${genericParameterTypes.size}"
if (genericParameterTypes[0].toString() != "T") return "fail 2: ${genericParameterTypes[0]}"
if (genericParameterTypes[1].toString() != "T") return "fail 3: ${genericParameterTypes[1]}"
val comparable2 = CustomerService().callInline()
val method2 = comparable2.javaClass.getMethod("compare", Any::class.java, Any::class.java)
val genericParameterTypes2 = method2.genericParameterTypes
if (genericParameterTypes2.size != 2) return "fail 4: ${genericParameterTypes2.size}"
var name = (genericParameterTypes2[0] as Class<*>).name
if (name != "java.lang.String") return "fail 5: ${name}"
name = (genericParameterTypes2[1] as Class<*>).name
if (name != "java.lang.String") return "fail 6: ${name}"
return "OK"
}
@@ -0,0 +1,24 @@
package test
import java.util.*
open class CustomerService {
fun <T> comparator() = object : Comparator<T> {
override fun compare(o1: T, o2: T): Int {
throw UnsupportedOperationException()
}
}
inline fun <T> comparator(crossinline z: () -> Int) = object : Comparator<T> {
override fun compare(o1: T, o2: T): Int {
return z()
}
}
fun callInline() = comparator<String> { 1 }
}
@@ -0,0 +1,25 @@
//NO_CHECK_LAMBDA_INLINING
import test.*
fun box(): String {
val comparable = CustomerService().comparator<String>()
val method = comparable.javaClass.getMethod("compare", Any::class.java, Any::class.java)
val genericParameterTypes = method.genericParameterTypes
if (genericParameterTypes.size != 2) return "fail 1: ${genericParameterTypes.size}"
if (genericParameterTypes[0].toString() != "T") return "fail 2: ${genericParameterTypes[0]}"
if (genericParameterTypes[1].toString() != "T") return "fail 3: ${genericParameterTypes[1]}"
val comparable2 = CustomerService().callInline()
val method2 = comparable2.javaClass.getMethod("compare", Any::class.java, Any::class.java)
val genericParameterTypes2 = method2.genericParameterTypes
if (genericParameterTypes2.size != 2) return "fail 1: ${genericParameterTypes2.size}"
var name = (genericParameterTypes2[0] as Class<*>).name
if (name != "java.lang.String") return "fail 5: ${name}"
name = (genericParameterTypes2[1] as Class<*>).name
if (name != "java.lang.String") return "fail 6: ${name}"
return "OK"
}
@@ -0,0 +1,25 @@
package test
interface MComparator<T> {
fun compare(o1: T, o2: T): Int
}
open class CustomerService {
fun <T> comparator() = object : MComparator<T> {
override fun compare(o1: T, o2: T): Int {
throw UnsupportedOperationException()
}
}
inline fun <T> comparator(crossinline z: () -> Int) = object : MComparator<T> {
override fun compare(o1: T, o2: T): Int {
return z()
}
}
fun callInline() = comparator<String> { 1 }
}