[NI] Make callable references more robust to overloads of outer call

#KT-30676 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2019-04-04 12:03:15 +03:00
parent 20a7f387bf
commit c3bc6ef2fa
17 changed files with 147 additions and 17 deletions
@@ -15,5 +15,5 @@ fun take(f: () -> Unit) {}
fun test() {
B::foo checkType { _<KFunction1<B, Unit>>() }
<!NI;OVERLOAD_RESOLUTION_AMBIGUITY, OI;NONE_APPLICABLE!>take<!>(B::<!NI;DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
<!NONE_APPLICABLE!>take<!>(B::<!NI;DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
}
@@ -0,0 +1,18 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty1
class Inv<T>
fun <T, R : Number> foo(prop: KProperty1<T, R>, p: String = "") {}
fun <T, R> foo(prop: KProperty1<T, Inv<R>>, p: Int = 42) {}
class A {
val prop = 42
}
fun test() {
foo(A::prop)
}
@@ -0,0 +1,20 @@
package
public fun </*0*/ T, /*1*/ R> foo(/*0*/ prop: kotlin.reflect.KProperty1<T, Inv<R>>, /*1*/ p: kotlin.Int = ...): kotlin.Unit
public fun </*0*/ T, /*1*/ R : kotlin.Number> foo(/*0*/ prop: kotlin.reflect.KProperty1<T, R>, /*1*/ p: kotlin.String = ...): kotlin.Unit
public fun test(): kotlin.Unit
public final class A {
public constructor A()
public final val prop: kotlin.Int = 42
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 Inv</*0*/ T> {
public constructor Inv</*0*/ T>()
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
}
@@ -0,0 +1,16 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Base
class Inv<K> : Base
fun foo(x: Int): Inv<Int> = TODO()
fun foo(y: String): Inv<String> = TODO()
fun <T, R : Number> bar(f: (T) -> Inv<R>, p: String = "") {}
fun <T, R : Base> bar(f: (T) -> Inv<R>, p: Int = 4) {}
fun test() {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>(::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
}
@@ -0,0 +1,20 @@
package
public fun </*0*/ T, /*1*/ R : Base> bar(/*0*/ f: (T) -> Inv<R>, /*1*/ p: kotlin.Int = ...): kotlin.Unit
public fun </*0*/ T, /*1*/ R : kotlin.Number> bar(/*0*/ f: (T) -> Inv<R>, /*1*/ p: kotlin.String = ...): kotlin.Unit
public fun foo(/*0*/ x: kotlin.Int): Inv<kotlin.Int>
public fun foo(/*0*/ y: kotlin.String): Inv<kotlin.String>
public fun test(): kotlin.Unit
public interface Base {
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 Inv</*0*/ K> : Base {
public constructor Inv</*0*/ K>()
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
}
@@ -21,7 +21,7 @@ fun fn3(i: Int, f: (Int, Int, Int) -> Int): Int = f(i, i, i)
val x1 = fn1(1, ::foo, ::foo)
val x2 = fn1(1, ::foo, ::bar)
val x3 = <!NI;OVERLOAD_RESOLUTION_AMBIGUITY!>fn2<!>(::<!NI;DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>, ::<!NI;DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
val x3 = fn2(::bar, ::foo)
val x4 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>fn2<!>(::<!NI;DEBUG_INFO_MISSING_UNRESOLVED, OI;OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>, ::<!NI;DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>)
val x5 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>fn2<!>(::<!NI;DEBUG_INFO_MISSING_UNRESOLVED, OI;OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>, ::<!NI;DEBUG_INFO_MISSING_UNRESOLVED, OI;OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>)
@@ -2,7 +2,7 @@ package
public val x1: kotlin.String
public val x2: kotlin.String
public val x3: [ERROR : Type for fn2(::bar, ::foo)]
public val x3: kotlin.String
public val x4: [ERROR : Type for fn2(::foo, ::bar)]
public val x5: [ERROR : Type for fn2(::foo, ::foo)]
public val x6: kotlin.Int