Approximate projections in SAM type when creating SAM adapter

Use the same approach as Java 8 applies to function types
(see non-wildcard parametrization in §9.9 of JLS)

 #KT-6918 Fixed
This commit is contained in:
Denis Zharkov
2016-01-22 14:42:08 +03:00
parent d87b13931d
commit a5c13ce8cf
14 changed files with 390 additions and 38 deletions
@@ -0,0 +1,52 @@
// !CHECK_TYPE
// FILE: EventListener.java
public interface EventListener<E> {
E handle(String x);
}
// FILE: A.java
public class A {
public void foo(EventListener<?> l) {
}
public static void bar(EventListener<?> l) {
}
public static void baz(EventListener<? extends CharSequence> l) {
}
}
// FILE: main.kt
fun main() {
A().foo {
x -> 1
}
A.bar {
x -> 1
}
// baz
A.baz {
x -> "" // OK
}
A.baz {
x -> <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
}
val block: (String) -> Any? = {
x -> 1
}
A().foo(block)
A.bar(block)
val block2: (String) -> CharSequence? = {
x -> ""
}
A.<!NONE_APPLICABLE!>baz<!>(block)
A.baz(block2)
}
@@ -0,0 +1,25 @@
package
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (kotlin.String!) -> E!): EventListener<E>
public fun main(): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(/*0*/ l: EventListener<*>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.String!) -> kotlin.Any!)!): kotlin.Unit
public open fun bar(/*0*/ l: EventListener<*>!): kotlin.Unit
public final /*synthesized*/ fun baz(/*0*/ l: ((kotlin.String!) -> kotlin.CharSequence!)!): kotlin.Unit
public open fun baz(/*0*/ l: EventListener<out kotlin.CharSequence!>!): kotlin.Unit
}
public interface EventListener</*0*/ E : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun handle(/*0*/ x: kotlin.String!): E!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,32 @@
// !CHECK_TYPE
// FILE: EventListener.java
public interface EventListener<E> {
void handle(E e);
}
// FILE: A.java
public class A {
public void foo(EventListener<?> l) {
}
public static void bar(EventListener<?> l) {
}
public static void baz(EventListener<? extends CharSequence> l) {
}
}
// FILE: main.kt
fun main() {
A().foo {
x -> x checkType { _<Any?>() }
}
A.bar {
x -> x checkType { _<Any?>() }
}
A.baz {
x -> x checkType { _<CharSequence?>() }
}
}
@@ -0,0 +1,25 @@
package
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (E!) -> kotlin.Unit): EventListener<E>
public fun main(): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(/*0*/ l: EventListener<*>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.Any!) -> kotlin.Unit)!): kotlin.Unit
public open fun bar(/*0*/ l: EventListener<*>!): kotlin.Unit
public final /*synthesized*/ fun baz(/*0*/ l: ((kotlin.CharSequence!) -> kotlin.Unit)!): kotlin.Unit
public open fun baz(/*0*/ l: EventListener<out kotlin.CharSequence!>!): kotlin.Unit
}
public interface EventListener</*0*/ E : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun handle(/*0*/ e: E!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,25 @@
// !CHECK_TYPE
// FILE: EventListener.java
public interface EventListener<E> {
void handle(E e);
}
// FILE: A.java
public class A {
public void foo(EventListener<? super CharSequence> l) {
}
public static void bar(EventListener<? super String> l) {
}
}
// FILE: main.kt
fun main() {
A().foo {
x -> x checkType { _<CharSequence?>() }
}
A.bar {
x -> x checkType { _<String>() }
}
}
@@ -0,0 +1,23 @@
package
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (E!) -> kotlin.Unit): EventListener<E>
public fun main(): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(/*0*/ l: EventListener<in kotlin.CharSequence!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.String!) -> kotlin.Unit)!): kotlin.Unit
public open fun bar(/*0*/ l: EventListener<in kotlin.String!>!): kotlin.Unit
}
public interface EventListener</*0*/ E : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun handle(/*0*/ e: E!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,27 @@
// !CHECK_TYPE
// FILE: Function.java
public interface Function<E extends CharSequence, F extends java.util.Map<String, E>> {
E handle(F f);
}
// FILE: A.java
public class A {
public void foo(Function<?, ?> l) {
}
public static void bar(Function<?, ?> l) {
}
}
// FILE: main.kt
fun main() {
A().foo <!TYPE_MISMATCH!>{
<!CANNOT_INFER_PARAMETER_TYPE!>x<!> ->
""
}<!>
A.bar <!TYPE_MISMATCH!>{
<!CANNOT_INFER_PARAMETER_TYPE!>x<!> ->
""
}<!>
}
@@ -0,0 +1,22 @@
package
public /*synthesized*/ fun </*0*/ E : kotlin.CharSequence!, /*1*/ F : kotlin.collections.(Mutable)Map<kotlin.String!, E!>!> Function(/*0*/ function: (F!) -> E!): Function<E, F>
public fun main(): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(/*0*/ l: Function<*, *>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun bar(/*0*/ l: Function<*, *>!): kotlin.Unit
}
public interface Function</*0*/ E : kotlin.CharSequence!, /*1*/ F : kotlin.collections.(Mutable)Map<kotlin.String!, E!>!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun handle(/*0*/ f: F!): E!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,33 @@
// !CHECK_TYPE
// FILE: Function.java
public interface Function<E extends java.util.Map<String, Integer>, F extends CharSequence> {
F handle(E e);
}
// FILE: A.java
public class A {
public void foo(Function<?, ?> l) {
}
public static void bar(Function<?, ?> l) {
}
}
// FILE: main.kt
fun main() {
A().foo {
x ->
x checkType { _<Map<String, Int>?>() }
""
}
A.bar {
x ->
x checkType { _<Map<String, Int>>() }
""
}
val block: (Map<String, Int>) -> CharSequence = { x -> "" }
A().foo(block)
A.bar(block)
}
@@ -0,0 +1,23 @@
package
public /*synthesized*/ fun </*0*/ E : kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!, /*1*/ F : kotlin.CharSequence!> Function(/*0*/ function: (E!) -> F!): Function<E, F>
public fun main(): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(/*0*/ l: Function<*, *>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!) -> kotlin.CharSequence!)!): kotlin.Unit
public open fun bar(/*0*/ l: Function<*, *>!): kotlin.Unit
}
public interface Function</*0*/ E : kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!, /*1*/ F : kotlin.CharSequence!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun handle(/*0*/ e: E!): F!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}