[FIR] Improve diagnostic reporting & don't use error symbol for candidate if possible
Also introduce few new diagnostics: - NONE_APPLICABLE more many inapplicable candidates - HIDDEN for visible candidates
This commit is contained in:
committed by
Mikhail Glukhikh
parent
5c0528b61e
commit
f283f2db43
-40
@@ -1,40 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNNECESSARY_SAFE_CALL
|
||||
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
package p
|
||||
|
||||
public interface B {
|
||||
public fun <T> foo(a: T): B?
|
||||
}
|
||||
|
||||
// MODULE: m2(m1)
|
||||
// FILE: b.kt
|
||||
package p
|
||||
|
||||
public interface C : B {
|
||||
override fun <T> foo(a: T): B?
|
||||
|
||||
}
|
||||
|
||||
// MODULE: m3
|
||||
// FILE: b.kt
|
||||
package p
|
||||
|
||||
public interface Tr
|
||||
|
||||
public interface B {
|
||||
public fun <T: Tr?> foo(a: T): B?
|
||||
}
|
||||
|
||||
// MODULE: m4(m3, m2)
|
||||
// FILE: c.kt
|
||||
import p.*
|
||||
|
||||
fun test(b: B?) {
|
||||
if (b is C) {
|
||||
// hard to find parameters for an ambiguous call, so we rely on NONE_APPLICABLE here
|
||||
// as opposed to diagnostics for a single unmatched candidate
|
||||
b?.<!INAPPLICABLE_CANDIDATE!>foo<!>()
|
||||
}
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNNECESSARY_SAFE_CALL
|
||||
|
||||
// MODULE: m1
|
||||
|
||||
+1
-1
@@ -16,5 +16,5 @@ import p.f
|
||||
|
||||
fun test() {
|
||||
// There should be no "none applicable" error here
|
||||
<!INAPPLICABLE_CANDIDATE!>f<!>(
|
||||
<!NONE_APPLICABLE!>f<!>(
|
||||
<!SYNTAX!><!>}
|
||||
|
||||
@@ -22,14 +22,14 @@ internal class B
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
val _a = <!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val _v = <!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
val _a = <!HIDDEN!>a<!>
|
||||
val _v = <!HIDDEN!>v<!>
|
||||
<!HIDDEN!>a<!>()
|
||||
<!HIDDEN!>B<!>()
|
||||
|
||||
val inst = A()
|
||||
val ia = inst.<!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val iv = inst.<!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
}
|
||||
val ia = inst.<!HIDDEN!>a<!>
|
||||
val iv = inst.<!HIDDEN!>v<!>
|
||||
inst.<!HIDDEN!>a<!>()
|
||||
inst.<!HIDDEN!>B<!>()
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ private val a = 1
|
||||
|
||||
package p
|
||||
|
||||
val b = <!INAPPLICABLE_CANDIDATE!>a<!> // same package, same module
|
||||
val b = <!HIDDEN!>a<!> // same package, same module
|
||||
|
||||
// MODULE: m2(m1)
|
||||
// FILE: c.kt
|
||||
|
||||
package p
|
||||
|
||||
val c = <!INAPPLICABLE_CANDIDATE!>a<!> // same package, another module
|
||||
val c = <!HIDDEN!>a<!> // same package, another module
|
||||
|
||||
+17
-17
@@ -30,27 +30,27 @@ internal class B
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
val _a = <!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val _v = <!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
val _a = <!HIDDEN!>a<!>
|
||||
val _v = <!HIDDEN!>v<!>
|
||||
<!HIDDEN!>a<!>()
|
||||
<!HIDDEN!>B<!>()
|
||||
|
||||
val inst = A()
|
||||
val ia = inst.<!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val iv = inst.<!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
val ia = inst.<!HIDDEN!>a<!>
|
||||
val iv = inst.<!HIDDEN!>v<!>
|
||||
inst.<!HIDDEN!>a<!>()
|
||||
inst.<!HIDDEN!>B<!>()
|
||||
}
|
||||
|
||||
inline fun testInline() {
|
||||
val _a = <!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val _v = <!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
val _a = <!HIDDEN!>a<!>
|
||||
val _v = <!HIDDEN!>v<!>
|
||||
<!HIDDEN!>a<!>()
|
||||
<!HIDDEN!>B<!>()
|
||||
|
||||
val inst = A()
|
||||
val ia = inst.<!INAPPLICABLE_CANDIDATE!>a<!>
|
||||
val iv = inst.<!INAPPLICABLE_CANDIDATE!>v<!>
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>a<!>()
|
||||
inst.<!INAPPLICABLE_CANDIDATE!>B<!>()
|
||||
}
|
||||
val ia = inst.<!HIDDEN!>a<!>
|
||||
val iv = inst.<!HIDDEN!>v<!>
|
||||
inst.<!HIDDEN!>a<!>()
|
||||
inst.<!HIDDEN!>B<!>()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user