NI: Allow to resolve to functions with SAM conversion and passing array without spread as vararg (with warning)

^KT-35224 Fixed
This commit is contained in:
Victor Petukhov
2019-12-04 20:29:03 +03:00
parent fe875d628d
commit 07269661b4
33 changed files with 573 additions and 27 deletions
@@ -0,0 +1,54 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument
// IGNORE_BACKEND: JS
// SKIP_TXT
// FILE: Test.java
public class Test {
public static String foo1(Runnable r, String... strs) {
return null;
}
public String foo2(Runnable r1, Runnable r2, String... strs) {
return null;
}
public Test(Runnable r, String... strs) {}
public Test(Runnable r, Runnable r, String... strs) {}
}
// FILE: main.kt
fun main(x2: Runnable) {
val x1 = {}
val x3 = arrayOf<String>()
Test.foo1({}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
Test.foo1({}, *arrayOf())
Test.foo1({}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>x3<!>)
Test.foo1({}, *arrayOf(""))
Test.foo1(x1, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
Test.foo1(x1, *arrayOf())
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf()<!>)
Test.foo1(x2, *arrayOf())
Test.foo1(x1, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>x3<!>)
Test.foo1(x1, *x3)
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf("")<!>)
Test.foo1(x2, *arrayOf(""))
val i1 = Test({}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
val i2 = Test({}, *arrayOf())
val i3 = Test({}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>x3<!>)
val i4 = Test({}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf("")<!>)
val i5 = Test({}, {}, *arrayOf(""))
val i6 = Test({}, {}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
i1.foo2({}, {}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
i1.foo2({}, {}, *arrayOf())
i1.foo2({}, <!TYPE_MISMATCH!>x2<!>, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf()<!>)
i1.foo2(x2, {}, *arrayOf())
i1.foo2({}, {}, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>arrayOf("")<!>)
i1.foo2({}, {}, *x3)
i1.foo2({}, <!TYPE_MISMATCH!>x2<!>, <!TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG!>x3<!>)
i1.foo2(x2, {}, *arrayOf(""))
}
@@ -0,0 +1,54 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument +ProhibitVarargAsArrayAfterSamArgument
// IGNORE_BACKEND: JS
// SKIP_TXT
// FILE: Test.java
public class Test {
public static String foo1(Runnable r, String... strs) {
return null;
}
public String foo2(Runnable r, Runnable r, String... strs) {
return null;
}
public Test(Runnable r, String... strs) {}
public Test(Runnable r, Runnable r, String... strs) {}
}
// FILE: main.kt
fun main(x2: Runnable) {
val x1 = {}
val x3 = arrayOf<String>()
Test.foo1({}, <!TYPE_MISMATCH!>arrayOf()<!>)
Test.foo1({}, *arrayOf())
Test.foo1({}, *x3)
Test.foo1({}, <!TYPE_MISMATCH!>arrayOf("")<!>)
Test.foo1(x1, <!TYPE_MISMATCH!>arrayOf()<!>)
Test.foo1(x1, *arrayOf())
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf()<!>)
Test.foo1(x2, *arrayOf())
Test.foo1(x1, <!TYPE_MISMATCH!>x3<!>)
Test.foo1(x1, *x3)
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf("")<!>)
Test.foo1(x2, *arrayOf(""))
val i1 = <!NONE_APPLICABLE!>Test<!>({}, arrayOf())
val i2 = Test({}, *arrayOf())
val i3 = <!NONE_APPLICABLE!>Test<!>({}, x3)
val i4 = <!NONE_APPLICABLE!>Test<!>({}, arrayOf(""))
val i5 = Test({}, {}, *arrayOf(""))
val i6 = <!NONE_APPLICABLE!>Test<!>({}, {}, arrayOf())
i2.foo2({}, {}, <!TYPE_MISMATCH!>arrayOf()<!>)
i2.foo2({}, {}, *arrayOf())
i2.foo2({}, x2, <!TYPE_MISMATCH!>arrayOf()<!>)
i2.foo2(x2, {}, *arrayOf())
i2.foo2({}, {}, <!TYPE_MISMATCH!>arrayOf("")<!>)
i2.foo2({}, {}, *x3)
i2.foo2({}, x2, <!TYPE_MISMATCH!>x3<!>)
i2.foo2(x2, {}, *arrayOf(""))
}
@@ -0,0 +1,54 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
// IGNORE_BACKEND: JS, JS_IR
// SKIP_TXT
// FILE: Test.java
public class Test {
public static String foo1(Runnable r, String... strs) {
return null;
}
public String foo2(Runnable r, Runnable r, String... strs) {
return null;
}
public Test(Runnable r, String... strs) {}
public Test(Runnable r, Runnable r, String... strs) {}
}
// FILE: main.kt
fun main(x2: Runnable) {
val x1 = {}
val x3 = arrayOf<String>()
Test.foo1({}, arrayOf())
Test.foo1(<!TYPE_MISMATCH!>{}<!>, *arrayOf())
Test.foo1(<!TYPE_MISMATCH!>{}<!>, *x3)
Test.foo1({}, arrayOf(""))
Test.foo1(x1, arrayOf())
Test.foo1(<!TYPE_MISMATCH!>x1<!>, *arrayOf())
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf()<!>)
Test.foo1(x2, *arrayOf())
Test.foo1(x1, x3)
Test.foo1(<!TYPE_MISMATCH!>x1<!>, *x3)
Test.foo1(x2, <!TYPE_MISMATCH!>arrayOf("")<!>)
Test.foo1(x2, *arrayOf(""))
val i1 = Test({}, arrayOf())
val i2 = <!NONE_APPLICABLE!>Test<!>({}, *arrayOf())
val i3 = Test({}, x3)
val i4 = Test({}, arrayOf(""))
val i5 = <!NONE_APPLICABLE!>Test<!>({}, {}, *arrayOf(""))
val i6 = Test({}, {}, arrayOf())
i1.foo2({}, {}, arrayOf())
i1.foo2(<!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>, *arrayOf())
i1.foo2(<!TYPE_MISMATCH!>{}<!>, x2, <!TYPE_MISMATCH!>arrayOf()<!>)
i1.foo2(x2, <!TYPE_MISMATCH!>{}<!>, *arrayOf())
i1.foo2({}, {}, arrayOf(""))
i1.foo2(<!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>, *x3)
i1.foo2(<!TYPE_MISMATCH!>{}<!>, x2, <!TYPE_MISMATCH!>x3<!>)
i1.foo2(x2, <!TYPE_MISMATCH!>{}<!>, *arrayOf(""))
}