[NI] Fix passing callable references to suspend functions as functional parameter

#KT-32452
This commit is contained in:
Dmitriy Novozhilov
2019-07-15 13:08:11 +03:00
parent 127be9be03
commit 58b4ab35f0
8 changed files with 111 additions and 1 deletions
@@ -0,0 +1,26 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
// Issue: KT-32256
fun main() {
myMethod(::refA)
myMethod(::refB)
anotherMethod(::refA)
anotherMethod(::refB)
}
suspend fun refA(input: String): String {
return input
}
suspend fun refB(): String {
return "Hello, World!"
}
fun myMethod(f: suspend (String) -> String) {}
fun myMethod(f: suspend () -> String) {}
fun <I, O> anotherMethod(f: suspend (I) -> O) {}
fun <O> anotherMethod(f: suspend () -> O) {}
@@ -0,0 +1,9 @@
package
public fun </*0*/ O> anotherMethod(/*0*/ f: suspend () -> O): kotlin.Unit
public fun </*0*/ I, /*1*/ O> anotherMethod(/*0*/ f: suspend (I) -> O): kotlin.Unit
public fun main(): kotlin.Unit
public fun myMethod(/*0*/ f: suspend () -> kotlin.String): kotlin.Unit
public fun myMethod(/*0*/ f: suspend (kotlin.String) -> kotlin.String): kotlin.Unit
public suspend fun refA(/*0*/ input: kotlin.String): kotlin.String
public suspend fun refB(): kotlin.String
@@ -0,0 +1,17 @@
// !WITH_NEW_INFERENCE
// !DIAGNOSTICS: -UNUSED_PARAMETER
// ISSUE: KT-32452
interface A {
suspend fun foo(input: String): String
}
open class B<T : Any> {
fun <U, R : Any, T> call(function: suspend T.(U) -> R): R = TODO()
fun <U, R : Any, T> call(function: suspend T.(U) -> List<R>): List<R> = TODO()
}
class MyService : A, B<A>() {
override suspend fun foo(input: String) = call(A::foo)
}
@@ -0,0 +1,27 @@
package
public interface A {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract suspend fun foo(/*0*/ input: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class B</*0*/ T : kotlin.Any> {
public constructor B</*0*/ T : kotlin.Any>()
public final fun </*0*/ U, /*1*/ R : kotlin.Any, /*2*/ T> call(/*0*/ function: suspend T.(U) -> R): R
public final fun </*0*/ U, /*1*/ R : kotlin.Any, /*2*/ T> call(/*0*/ function: suspend T.(U) -> kotlin.collections.List<R>): kotlin.collections.List<R>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class MyService : A, B<A> {
public constructor MyService()
public final override /*1*/ /*fake_override*/ fun </*0*/ U, /*1*/ R : kotlin.Any, /*2*/ T> call(/*0*/ function: suspend T.(U) -> R): R
public final override /*1*/ /*fake_override*/ fun </*0*/ U, /*1*/ R : kotlin.Any, /*2*/ T> call(/*0*/ function: suspend T.(U) -> kotlin.collections.List<R>): kotlin.collections.List<R>
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ suspend fun foo(/*0*/ input: kotlin.String): kotlin.String
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}