[FIR] Report INAPPLICABLE_CANDIDATE or more specific diagnostic for callable references

... instead of just UNRESOLVED_REFERENCE when something went wrong
during resolution.

#KT-59401 related
This commit is contained in:
Kirill Rakhman
2023-11-03 13:39:27 +01:00
committed by Space Team
parent 6b7eeec181
commit d91000e39c
44 changed files with 80 additions and 78 deletions
@@ -6,10 +6,10 @@ public interface J {
// FILE: test.kt
fun f1(x: Int?): Any = x::<!UNRESOLVED_REFERENCE!>hashCode<!>
fun <T> f2(t: T): Any = t::<!UNRESOLVED_REFERENCE!>hashCode<!>
fun <S : String?> f3(s: S): Any = s::<!UNRESOLVED_REFERENCE!>hashCode<!>
fun <U : Any> f4(u: U?): Any = u::<!UNRESOLVED_REFERENCE!>hashCode<!>
fun f5(c: List<*>): Any = c[0]::<!UNRESOLVED_REFERENCE!>hashCode<!>
fun f1(x: Int?): Any = x::<!UNSAFE_CALL!>hashCode<!>
fun <T> f2(t: T): Any = t::<!UNSAFE_CALL!>hashCode<!>
fun <S : String?> f3(s: S): Any = s::<!UNSAFE_CALL!>hashCode<!>
fun <U : Any> f4(u: U?): Any = u::<!UNSAFE_CALL!>hashCode<!>
fun f5(c: List<*>): Any = c[0]::<!UNSAFE_CALL!>hashCode<!>
fun f6(j: J): Any = j.platformString()::hashCode
@@ -9,7 +9,7 @@ class Foo<out T>(name: T) {
val ok2 = this@Foo::prop
val ok3 = object { val y: Any = this@Foo::prop }
val fail1 = Foo(prop)::<!UNRESOLVED_REFERENCE!>prop<!>
val fail1 = Foo(prop)::<!INVISIBLE_REFERENCE!>prop<!>
}
fun testFunc() {
@@ -17,7 +17,7 @@ class Foo<out T>(name: T) {
val ok2 = this@Foo::func
val ok3 = object { val y: Any = this@Foo::func }
val fail1 = Foo(prop)::<!UNRESOLVED_REFERENCE!>func<!>
val fail1 = Foo(prop)::<!INVISIBLE_REFERENCE!>func<!>
}
private fun func(t: T): T = t
@@ -19,9 +19,9 @@ class Test {
fun <T> List<T>.testCallable1(): () -> Unit = a::foo
fun <T> List<T>.testCallable1a(): () -> Unit = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>a<!><T>::foo
fun <T> List<T>.testCallable2(): () -> Unit = b?::<!UNRESOLVED_REFERENCE!>foo<!>
fun <T> List<T>.testCallable3(): () -> Unit = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>b<!><T, Any>::<!UNRESOLVED_REFERENCE!>foo<!>
fun <T> List<T>.testCallable4(): () -> Unit = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>b<!><T>?::<!UNRESOLVED_REFERENCE!>foo<!>
fun <T> List<T>.testCallable2(): () -> Unit = b?::<!UNSAFE_CALL!>foo<!>
fun <T> List<T>.testCallable3(): () -> Unit = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>b<!><T, Any>::<!UNSAFE_CALL!>foo<!>
fun <T> List<T>.testCallable4(): () -> Unit = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>b<!><T>?::<!UNSAFE_CALL!>foo<!>
fun <T> List<T>.testClassLiteral1() = a::class
fun <T> List<T>.testClassLiteral1a() = <!EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS!>a<!><T>::class
@@ -4,4 +4,4 @@ package test
fun nullableFun(): Int? = null
fun Int.foo() {}
val test1 = nullableFun()?::<!UNRESOLVED_REFERENCE!>foo<!>
val test1 = nullableFun()?::<!UNSAFE_CALL!>foo<!>