FIR checker: differentiate UNSAFE_CALL from INAPPLICABLE_CANDIDATE

To do so, inside the root cause of inapplicable candidate errors,
we will record expected/actual type of receiver, if any.
That will help identifying inapplicable calls on nullable receiver.
This commit is contained in:
Jinseong Jeon
2021-01-26 16:03:27 -08:00
committed by Mikhail Glukhikh
parent 4b823eca21
commit e72ddbcbfe
275 changed files with 1426 additions and 1388 deletions
@@ -105,8 +105,8 @@ fun case_6() {
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Short>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!>)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Int>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!>)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!>)
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Byte>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Short>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Int>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Byte>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Short>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Int>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
}
@@ -3,23 +3,23 @@
// TESTCASE NUMBER: 1
fun case_1() {
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!>)
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!>)
<!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!ILLEGAL_CONST_EXPRESSION!>9223372036854775808L<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
}
// TESTCASE NUMBER: 2
fun case_2() {
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!>)
<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!>)
<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!>)
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000L<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Long>(<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!>)
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!> <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
<!AMBIGUITY!>-<!><!ILLEGAL_CONST_EXPRESSION!>100000000000000000000000000000000l<!> <!UNSAFE_CALL!>checkType<!> { <!NONE_APPLICABLE!>check<!><Long>() }
}
@@ -15,7 +15,7 @@ class A() {
fun case1() {
var b: Case1? = Case1()
<!INAPPLICABLE_CANDIDATE!>--<!>b?.a
<!UNSAFE_CALL!>--<!>b?.a
}
@@ -15,7 +15,7 @@ class A() {
fun case1() {
var b: Case1? = Case1()
<!INAPPLICABLE_CANDIDATE!>++<!>b?.a
<!UNSAFE_CALL!>++<!>b?.a
}
@@ -63,7 +63,7 @@ fun case3() {
*/
fun case4(marker : Marker?) {
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.foo; typeCall: function")!>foo(y=1)<!>
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x=1)<!><!INAPPLICABLE_CANDIDATE!>><!><!SYNTAX!><!>
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x=1)<!><!UNSAFE_CALL!>><!><!SYNTAX!><!>
}
@@ -63,7 +63,7 @@ fun case3() {
*/
fun case4(marker: Marker?) {
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.foo; typeCall: function")!>foo(y = { 1 })<!>
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x = { 1 })<!><!INAPPLICABLE_CANDIDATE!>><!><!SYNTAX!><!>
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x = { 1 })<!><!UNSAFE_CALL!>><!><!SYNTAX!><!>
}
@@ -8,7 +8,7 @@
*/
fun case1() {
val x : Case1? = Case1()
x.<!INAPPLICABLE_CANDIDATE!>x<!> = "0"
x.x = "0"
x?.x = "0"
<!VARIABLE_EXPECTED!>x::x<!> = TODO()
}
@@ -24,7 +24,7 @@ class Case1{
*/
fun case2() {
val x : Case2? = Case2(null)
x.<!INAPPLICABLE_CANDIDATE!>x<!> = "0"
x.x = "0"
x?.x = "0"
<!VARIABLE_EXPECTED!>x::x<!> = TODO()
}
@@ -37,7 +37,7 @@ class Case2(val x: Any?) {}
*/
fun case3() {
val x : Case3? = Case3()
x.<!INAPPLICABLE_CANDIDATE!>x<!> = "0"
x.x = "0"
x?.x = "0"
<!VARIABLE_EXPECTED!>x::x<!> = TODO()
}