Do not generate generic signature for SAM wrapper methods

#KT-23870 Fixed
This commit is contained in:
Alexander Udalov
2018-07-19 20:37:29 +02:00
parent ac6874c221
commit 20ddbc9698
7 changed files with 132 additions and 9 deletions
@@ -0,0 +1,32 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: J.java
import java.util.*;
public interface J<T extends Number> {
T foo(List<T> p0, Map<T, ? extends Set<T>> p1);
}
// FILE: K.kt
import kotlin.test.assertEquals
object O : J<Long> {
override fun foo(p0: List<Long>, p1: Map<Long, out Set<Long>>): Long = 42L
}
class A : J<Long> by O
fun box(): String {
val m = A::class.java.getDeclaredMethod("foo", List::class.java, Map::class.java)
assertEquals(
"[interface java.util.List, interface java.util.Map]",
m.parameterTypes.contentToString()
)
assertEquals(
"[java.util.List<java.lang.Long>, java.util.Map<java.lang.Long, ? extends java.util.Set<java.lang.Long>>]",
m.genericParameterTypes.contentToString()
)
return "OK"
}
@@ -0,0 +1,50 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// FILE: Java.java
import java.lang.reflect.Method;
import java.util.function.Predicate;
import java.util.*;
public final class Java {
public static Method getTest(Predicate<Object> predicate) throws NoSuchMethodException {
return predicate.getClass().getMethod("test", Object.class);
}
public static Method getFoo(ComplexPredicate<Long> predicate) throws NoSuchMethodException {
return predicate.getClass().getMethod("foo", Number.class, List.class, Map.class);
}
}
// FILE: ComplexPredicate.java
import java.util.*;
public interface ComplexPredicate<T extends Number> {
boolean foo(T p0, List<T> p1, Map<T, ? extends Set<T>> p2);
}
// FILE: K.kt
import java.lang.reflect.Method
import java.util.*
import kotlin.test.assertEquals
fun check(title: String, expected: String, method: Method) {
assertEquals(expected, method.parameterTypes.contentToString(), "Fail parameterTypes of $title")
assertEquals(expected, method.genericParameterTypes.contentToString(), "Fail genericParameterTypes of $title")
}
private fun bar(p0: Long, p1: List<Long>, p2: Map<Long, Set<Long>>) = true
fun box(): String {
check("SAM-implementing lambda 1", "[class java.lang.Object]", Java.getTest { Objects.nonNull(it) })
check("SAM-wrapped function reference 1", "[class java.lang.Object]", Java.getTest(Objects::nonNull))
check("SAM-implementing lambda 2", "[class java.lang.Number, interface java.util.List, interface java.util.Map]", Java.getFoo { p0, p1, p2 -> bar(p0, p1, p2) })
check("SAM-wrapped function reference 2", "[class java.lang.Number, interface java.util.List, interface java.util.Map]", Java.getFoo(::bar))
return "OK"
}