FIR: add UnsafeCall resolution diagnostics

Previously unsafe call is reported as part of InapplicableWrongReceiver.
This makes it difficult for the downstream checkers to report different
diagnostics.
This commit is contained in:
Tianyu Geng
2021-04-08 21:17:01 +03:00
committed by Mikhail Glukhikh
parent 43a2ad0467
commit 6a03f31e50
62 changed files with 283 additions and 283 deletions
+10 -10
View File
@@ -38,13 +38,13 @@ fun test() {
if (out != null && ins != null || out != null) {
ins?.read();
ins.<!NONE_APPLICABLE!>read<!>();
ins<!UNSAFE_CALL!>.<!>read();
out.println();
}
if (out == null || out.println(0) == Unit) {
out?.println(1)
out.println(<!TOO_MANY_ARGUMENTS!>1<!>)
out.<!NONE_APPLICABLE!>println<!>(1)
}
else {
out.println(2)
@@ -66,11 +66,11 @@ fun test() {
if (1 == 2 || out != null && out.println(1) == Unit) {
out?.println(2);
out.println(<!TOO_MANY_ARGUMENTS!>2<!>);
out.<!NONE_APPLICABLE!>println<!>(2);
}
else {
out?.println(3)
out.println(<!TOO_MANY_ARGUMENTS!>3<!>)
out.<!NONE_APPLICABLE!>println<!>(3)
}
out?.println()
@@ -103,7 +103,7 @@ fun test() {
if (out == null || out.println(0) == Unit) {
out?.println(1)
out.println(<!TOO_MANY_ARGUMENTS!>1<!>)
out.<!NONE_APPLICABLE!>println<!>(1)
}
else {
out.println(2)
@@ -114,12 +114,12 @@ fun test() {
}
else {
out?.println();
out.<!NONE_APPLICABLE!>println<!>();
out<!UNSAFE_CALL!>.<!>println();
}
if (out == null || out.println() == Unit) {
out?.println();
out.<!NONE_APPLICABLE!>println<!>();
out<!UNSAFE_CALL!>.<!>println();
}
else {
out.println();
@@ -127,11 +127,11 @@ fun test() {
if (1 == 2 || out != null && out.println(1) == Unit) {
out?.println(2);
out.println(<!TOO_MANY_ARGUMENTS!>2<!>);
out.<!NONE_APPLICABLE!>println<!>(2);
}
else {
out?.println(3)
out.println(<!TOO_MANY_ARGUMENTS!>3<!>)
out.<!NONE_APPLICABLE!>println<!>(3)
}
if (1 > 2) {
@@ -149,7 +149,7 @@ fun test() {
while (out2 == null) {
out2?.println();
out2.<!NONE_APPLICABLE!>println<!>();
out2<!UNSAFE_CALL!>.<!>println();
}
out2.println()
@@ -19,14 +19,14 @@ fun <F> main(x: F, y: F, z: F, w: F, m: F) {
val w1 = if (z != null) z else return
val w2: F!! = if (w != null) w else return
y1.<!INAPPLICABLE_CANDIDATE!>foo<!>()
y2.<!INAPPLICABLE_CANDIDATE!>foo<!>()
y1<!UNSAFE_CALL!>.<!>foo()
y2<!UNSAFE_CALL!>.<!>foo()
x1.foo()
x2.<!INAPPLICABLE_CANDIDATE!>foo<!>()
x2<!UNSAFE_CALL!>.<!>foo()
z1.foo()
z2.<!INAPPLICABLE_CANDIDATE!>foo<!>()
z2<!UNSAFE_CALL!>.<!>foo()
w1.foo()
w2.<!INAPPLICABLE_CANDIDATE!>foo<!>()
w2<!UNSAFE_CALL!>.<!>foo()
expectNN(m)
expectNN(m!!)
@@ -8,7 +8,7 @@ fun <R> List<R>.a() {}
fun test1(i: Int?) {
1.<!INAPPLICABLE_CANDIDATE!>a<!>()
i<!UNSAFE_CALL!>.<!>a()
i.<!INAPPLICABLE_CANDIDATE!>a<!>()
}
fun <R> test2(c: Collection<R>) {
@@ -19,7 +19,7 @@ fun Int.foo() {}
fun test3(s: String?) {
"".<!INAPPLICABLE_CANDIDATE!>foo<!>()
s<!UNSAFE_CALL!>.<!>foo()
s.<!INAPPLICABLE_CANDIDATE!>foo<!>()
"".foo(<!TOO_MANY_ARGUMENTS!>1<!>)
s.foo(<!TOO_MANY_ARGUMENTS!>"a"<!>)
}
@@ -52,5 +52,5 @@ fun test7(l: List<String?>) {
}
fun test8(l: List<Any>?) {
l<!UNSAFE_CALL!>.<!>b()
l.<!INAPPLICABLE_CANDIDATE!>b<!>()
}
@@ -13,7 +13,7 @@ fun <F : String?> bar(x: F) {
foo1(<!ARGUMENT_TYPE_MISMATCH!>x<!>)
foo1<F>(<!ARGUMENT_TYPE_MISMATCH!>x<!>)
x.<!INAPPLICABLE_CANDIDATE!>foo2<!>()
x<!UNSAFE_CALL!>.<!>foo2()
x.<!INAPPLICABLE_CANDIDATE!>foo2<!><F>()
}
@@ -1,6 +1,6 @@
fun <E : String?, T : ((CharSequence) -> Unit)?> foo(x: E, y: T) {
if (x != null) {
<!INAPPLICABLE_CANDIDATE!>y<!>(x)
<!UNSAFE_IMPLICIT_INVOKE_CALL!>y<!>(x)
}
if (y != null) {
@@ -1,6 +1,6 @@
fun <T : Any?> foo(x: T) {
if (x is String?) {
x.<!INAPPLICABLE_CANDIDATE!>length<!>
x<!UNSAFE_CALL!>.<!>length
if (x != null) {
x.length
@@ -24,7 +24,7 @@ fun <T : CharSequence?> foo(x: T) {
x<!UNNECESSARY_SAFE_CALL!>?.<!>bar1()
}
x.<!INAPPLICABLE_CANDIDATE!>length<!>
x<!UNSAFE_CALL!>.<!>length
if (x is String) {
x.length
@@ -23,7 +23,7 @@ fun <T : String?> T.foo() {
this<!UNNECESSARY_SAFE_CALL!>?.<!>bar1()
}
<!INAPPLICABLE_CANDIDATE!>length<!>
<!UNSAFE_CALL!>length<!>
if (this is String) {
length
@@ -8,7 +8,7 @@ class A<T : CharSequence?, E1 : T, E2: T?> {
x.bar()
if (1 == 1) {
y.<!INAPPLICABLE_CANDIDATE!>bar<!>()
y<!UNSAFE_CALL!>.<!>bar()
}
x?.bar()
@@ -7,7 +7,7 @@ fun CharSequence?.bar2() {}
fun <T : CharSequence> T.bar3() {}
fun <T : String?> foo(x: T) {
x.<!INAPPLICABLE_CANDIDATE!>length<!>
x<!UNSAFE_CALL!>.<!>length
x?.length
if (1 == 1) {
@@ -21,7 +21,7 @@ fun <T : String?> foo(x: T) {
x?.bar1()
x?.bar2()
x.<!INAPPLICABLE_CANDIDATE!>bar3<!>()
x<!UNSAFE_CALL!>.<!>bar3()
x?.let { it.length }
}
@@ -8,5 +8,5 @@ fun Array<String>.length() : Int {
}
fun test(array : Array<String?>?) {
array?.sure<Array<String?>>()<!UNSAFE_CALL!>.<!>length()
array?.sure<Array<String?>>().<!INAPPLICABLE_CANDIDATE!>length<!>()
}
@@ -80,7 +80,7 @@ operator fun <T> Foo6<T>.invoke(x: Int) {}
fun main(x: Bar6<String>?) {
x?.value(1)
x?.value.<!NONE_APPLICABLE!>invoke<!>(1)
x?.value<!UNSAFE_CALL!>.<!>invoke(1)
}
// Test case 7: top-level generic invoke and invoke with compatible additional dispatch recevier
@@ -108,7 +108,7 @@ operator fun Foo8<String>.invoke(x: Int) {}
fun main(x: Bar8<String>?) {
x?.value(1)
x?.value.<!NONE_APPLICABLE!>invoke<!>(1)
x?.value<!UNSAFE_CALL!>.<!>invoke(1)
}
// Test case 9: additional receiver, generic invoke with pure type perameter receiver
@@ -12,7 +12,7 @@ fun test(a: A) {
with("") {
a.x(<!NO_VALUE_FOR_PARAMETER!>)<!>
(a.x)(<!NO_VALUE_FOR_PARAMETER!>)<!>
<!UNSAFE_IMPLICIT_INVOKE_CALL!>(a.x)<!>()
if (a.x != null) {
a.x(<!NO_VALUE_FOR_PARAMETER!>)<!> // todo
(a.x)()
@@ -15,5 +15,5 @@ val test5: List<TNString?> = TODO()
val test6: () -> List<TNString> = TODO()
fun test(x: TNString) {
x.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
x<!UNSAFE_CALL!>.<!>hashCode()
}
@@ -87,7 +87,7 @@ fun test() {
this@with.<!UNRESOLVED_REFERENCE!>yield<!>("")
yield2("")
this@with<!UNSAFE_CALL!>.<!>yield2("")
this@with.<!INAPPLICABLE_CANDIDATE!>yield2<!>("")
}
}
}