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:
committed by
Mikhail Glukhikh
parent
43a2ad0467
commit
6a03f31e50
+10
-10
@@ -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()
|
||||
|
||||
|
||||
+5
-5
@@ -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!!)
|
||||
|
||||
+3
-3
@@ -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<!>()
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
+2
-2
@@ -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<!>()
|
||||
}
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+1
-1
@@ -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()
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -87,7 +87,7 @@ fun test() {
|
||||
this@with.<!UNRESOLVED_REFERENCE!>yield<!>("")
|
||||
|
||||
yield2("")
|
||||
this@with<!UNSAFE_CALL!>.<!>yield2("")
|
||||
this@with.<!INAPPLICABLE_CANDIDATE!>yield2<!>("")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user