[FIR] Improve mapping arguments to parameters

This commit is contained in:
Dmitriy Novozhilov
2020-02-14 11:10:46 +03:00
parent 2e597a3a32
commit e696d1d06a
43 changed files with 498 additions and 241 deletions
+2 -2
View File
@@ -12,6 +12,6 @@ fun test() {
v1({}, {})
<!INAPPLICABLE_CANDIDATE!>v1<!>({}, 1, {})
v1({}, {}, {it})
v1({}) {}
v1 {}
<!INAPPLICABLE_CANDIDATE!>v1<!>({}) {}
<!INAPPLICABLE_CANDIDATE!>v1<!> {}
}
@@ -12,47 +12,47 @@ fun main() {
join(1, "2", "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(*1, "2")
<!INAPPLICABLE_CANDIDATE!>join<!>(1, *"2")
join(x = 1, a = "2")
<!INAPPLICABLE_CANDIDATE!>join<!>(x = 1, a = "2")
<!INAPPLICABLE_CANDIDATE!>join<!>(x = *1, a = *"2")
<!INAPPLICABLE_CANDIDATE!>join<!>(x = 1, a = a)
join(x = 1, a = a)
<!INAPPLICABLE_CANDIDATE!>join<!>(x = 1, a = b)
join(1, *a)
<!INAPPLICABLE_CANDIDATE!>join<!>(1, *b)
<!INAPPLICABLE_CANDIDATE!>join<!>(1, *a, "3")
join(1, *a, "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(1, *b, "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(1, "4", *a, "3")
join(1, "4", *a, "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(1, "4", *b, "3")
join(1, "4", *a)
<!INAPPLICABLE_CANDIDATE!>join<!>(1, "4", *a, *a, "3")
join(1, "4", *a, *a, "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(1, "4", *a, *b, "3")
<!INAPPLICABLE_CANDIDATE!>join<!>(a = a, x = 1)
join(a = a, x = 1)
<!INAPPLICABLE_CANDIDATE!>join<!>(a = b, x = 1)
<!INAPPLICABLE_CANDIDATE!>join<!>(a = a, x = 1)
join(a = a, x = 1)
joinG<String>(1, "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(*1, "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(1, *"2")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(x = 1, a = a)
joinG<String>(x = 1, a = "2")
joinG<String>(x = 1, a = a)
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(x = 1, a = "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(x = *1, a = *"2")
joinG<String>(1, *a)
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(1, *a, "3")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(1, "4", *a, "3")
joinG<String>(1, *a, "3")
joinG<String>(1, "4", *a, "3")
joinG<String>(1, "4", *a)
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(1, "4", *a, *a, "3")
<!INAPPLICABLE_CANDIDATE!>joinG<!><String>(a = a, x = 1)
joinG<String>(1, "4", *a, *a, "3")
joinG<String>(a = a, x = 1)
joinG(1, "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!>(*1, "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!>(1, *"2")
joinG(x = 1, a = a)
joinG(x = 1, a = "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!>(x = 1, a = "2")
<!INAPPLICABLE_CANDIDATE!>joinG<!>(x = *1, a = *"2")
joinG(1, *a)
<!INAPPLICABLE_CANDIDATE!>joinG<!>(1, *a, "3")
<!INAPPLICABLE_CANDIDATE!>joinG<!>(1, "4", *a, "3")
joinG(1, *a, "3")
joinG(1, "4", *a, "3")
joinG(1, "4", *a)
<!INAPPLICABLE_CANDIDATE!>joinG<!>(1, "4", *a, *a, "3")
joinG(1, "4", *a, *a, "3")
joinG(a = a, x = 1)
val x1 = joinT(1, "2")
@@ -61,18 +61,18 @@ fun main() {
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x2)
val x6 = joinT(1, *a)
checkSubtype<String?>(x6)
val x7 = <!INAPPLICABLE_CANDIDATE!>joinT<!>(1, *a, "3")
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x7)
val x8 = <!INAPPLICABLE_CANDIDATE!>joinT<!>(1, "4", *a, "3")
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x8)
val x7 = joinT(1, *a, "3")
checkSubtype<String?>(x7)
val x8 = joinT(1, "4", *a, "3")
checkSubtype<String?>(x8)
val x9 = joinT(1, "4", *a)
checkSubtype<String?>(x9)
val x10 = <!INAPPLICABLE_CANDIDATE!>joinT<!>(1, "4", *a, *a, "3")
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x10)
val x10 = joinT(1, "4", *a, *a, "3")
checkSubtype<String?>(x10)
val x11 = joinT(a = a, x = 1)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x11)
checkSubtype<String?>(x11)
val x12 = joinT(x = 1, a = a)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String?>(x12)
checkSubtype<String?>(x12)
}
fun join(x : Int, vararg a : String) : String {
@@ -6,7 +6,7 @@ fun test(x: () -> Unit, y: () -> Unit) {
}
fun main() {
<!INAPPLICABLE_CANDIDATE!>test<!> {
test {
1
} {
2
@@ -5,7 +5,7 @@ import java.lang.invoke.MethodHandle
fun test(mh: MethodHandle) {
mh.invokeExact("1", "2")
mh.<!INAPPLICABLE_CANDIDATE!>invokeExact<!>(*emptyArray(), "X")
mh.<!INAPPLICABLE_CANDIDATE!>invokeExact<!>(*arrayOf("A", "B"), "C", *arrayOf("D", "E"))
mh.invokeExact(*emptyArray(), "X")
mh.invokeExact(*arrayOf("A", "B"), "C", *arrayOf("D", "E"))
mh.invoke(*arrayOf("A"))
}
@@ -5,7 +5,7 @@ import java.lang.invoke.MethodHandle
fun test(mh: MethodHandle) {
mh.invokeExact("1", "2")
mh.<!INAPPLICABLE_CANDIDATE!>invokeExact<!>(*emptyArray(), "X")
mh.<!INAPPLICABLE_CANDIDATE!>invokeExact<!>(*arrayOf("A", "B"), "C", *arrayOf("D", "E"))
mh.invokeExact(*emptyArray(), "X")
mh.invokeExact(*arrayOf("A", "B"), "C", *arrayOf("D", "E"))
mh.invoke(*arrayOf("A"))
}
@@ -10,14 +10,14 @@ fun foo(
) {}
fun main() {
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p2 = "2", 3.0)
foo(p1 = 1, "2", 3.0)
foo(1, p2 = "2", 3.0)
foo(1, "2", p3 = 3.0)
foo(p1 = 1)
foo(1, p2 = "2")
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, p2 = "2", 3.0)
foo(p1 = 1, p2 = "2", 3.0)
foo()
foo(1, p2 = "")
@@ -9,11 +9,11 @@ fun foo(
) {}
fun main() {
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p2 = "2", 3.0)
foo(p1 = 1, "2", 3.0)
foo(1, p2 = "2", 3.0)
foo(1, "2", p3 = 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, p2 = "2", 3.0)
foo(p1 = 1, p2 = "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, 3.0)
@@ -9,11 +9,11 @@ fun foo(
) {}
fun main() {
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p2 = "2", 3.0)
foo(p1 = 1, "2", 3.0)
foo(1, p2 = "2", 3.0)
foo(1, "2", p3 = 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, p2 = "2", 3.0)
foo(p1 = 1, p2 = "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, 3.0)
@@ -9,11 +9,11 @@ fun foo(
) {}
fun main() {
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p2 = "2", 3.0)
foo(p1 = 1, "2", 3.0)
foo(1, p2 = "2", 3.0)
foo(1, "2", p3 = 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(p1 = 1, p2 = "2", 3.0)
foo(p1 = 1, p2 = "2", 3.0)
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, p3 = 2.0, 3.0)
@@ -29,16 +29,16 @@ fun foo4(
fun main() {
<!INAPPLICABLE_CANDIDATE!>foo1<!>(1, 2, p2 = "3", 4.0)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(p1 = intArrayOf(1, 2), "3", p3 = 4.0)
foo1(p1 = intArrayOf(1, 2), "3", p3 = 4.0)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(p2 = "3", 4.0)
<!INAPPLICABLE_CANDIDATE!>foo2<!>(p1 = 1, "2", "3", p3 = 4.0)
<!INAPPLICABLE_CANDIDATE!>foo2<!>(1, p2 = arrayOf("2", "3"), 4.0)
foo2(p1 = 1, "2", "3", p3 = 4.0)
foo2(1, p2 = arrayOf("2", "3"), 4.0)
foo2(1, p3 = 3.0)
<!INAPPLICABLE_CANDIDATE!>foo3<!>(p1 = 1, "2", 3.0, 4.0)
<!INAPPLICABLE_CANDIDATE!>foo3<!>(p1 = 1, "2", p3 = doubleArrayOf(3.0, 4.0))
foo3(p1 = 1, "2", 3.0, 4.0)
foo3(p1 = 1, "2", p3 = doubleArrayOf(3.0, 4.0))
<!INAPPLICABLE_CANDIDATE!>foo4<!>(p1 = 1, "2", "3", p3 = 4.0, 5)
<!INAPPLICABLE_CANDIDATE!>foo4<!>(1, "2", "3", p3 = 4.0, 5)
@@ -50,8 +50,8 @@ fun main() {
<!INAPPLICABLE_CANDIDATE!>foo2<!>(1, p3 = 2.0, "4")
<!INAPPLICABLE_CANDIDATE!>foo2<!>(1, p3 = 2.0, *arrayOf("3", "4"))
<!INAPPLICABLE_CANDIDATE!>foo2<!>(1, p3 = 2.0, p2 = arrayOf("3", "4"))
foo2(1, p3 = 2.0, p2 = arrayOf("3", "4"))
<!INAPPLICABLE_CANDIDATE!>foo3<!>(1, p3 = doubleArrayOf(2.0, 3.0), "4")
<!INAPPLICABLE_CANDIDATE!>foo3<!>(1, p3 = doubleArrayOf(2.0, 3.0), p2 = "4")
foo3(1, p3 = doubleArrayOf(2.0, 3.0), p2 = "4")
}
@@ -96,7 +96,7 @@ fun testTwoLambdas() {
)
fun bar(): () -> Unit {
<!INAPPLICABLE_CANDIDATE!>twoLambdaArgs<!>()
twoLambdaArgs()
{}
{}
@@ -8,6 +8,6 @@ fun overloadedFun(arg: String, vararg args: String) = X1
fun overloadedFun(arg: String, vararg args: String, flag: Boolean = true) = X2
val test1a: X1 = overloadedFun("", "")
val test1b: X1 = overloadedFun("", args = "")
val test1b: X1 = <!INAPPLICABLE_CANDIDATE!>overloadedFun<!>("", args = "")
val test1c: X2 = overloadedFun("", "", "", flag = true)
@@ -9,5 +9,5 @@ fun overloadedFun5(s: String, vararg ss: String) = X2
val test1 = overloadedFun5("")
val test2 = overloadedFun5("", "")
val test3: X2 = overloadedFun5(s = "", ss = "")
val test4: X1 = overloadedFun5(ss = "")
val test3: X2 = <!INAPPLICABLE_CANDIDATE!>overloadedFun5<!>(s = "", ss = "")
val test4: X1 = <!INAPPLICABLE_CANDIDATE!>overloadedFun5<!>(ss = "")
@@ -2,7 +2,7 @@
fun <T> array(vararg x: T): Array<T> = null!!
open class B(vararg y: String) {
constructor(x: Int): <!INAPPLICABLE_CANDIDATE!>this<!>(x.toString(), *array("1"), "2")
constructor(x: Int): this(x.toString(), *array("1"), "2")
}
class A : B {
@@ -13,5 +13,5 @@ class A : B {
val b1 = B()
val b2 = B("1", "2", "3")
val b3 = <!INAPPLICABLE_CANDIDATE!>B<!>("1", *array("2", "3"), "4")
val b3 = B("1", *array("2", "3"), "4")
val b4 = B(1)
@@ -12,11 +12,11 @@ fun foo() {}
fun test_fun(s: String, arr: Array<String>) {
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(arr) // Error
withVararg(*arr) // OK
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(s = arr) // Error
withVararg(s = arr) // Error
withVararg(s = *arr) // OK
withVararg(s) // OK
withVararg(s = s) // Error
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(s = s) // Error
}
fun test_ann(s: String, arr: Array<String>) {
@@ -12,11 +12,11 @@ fun foo() {}
fun test_fun(s: String, arr: Array<String>) {
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(arr) // Error
withVararg(*arr) // OK
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(s = arr) // OK
withVararg(s = arr) // OK
withVararg(s = *arr) // Warning
withVararg(s) // OK
withVararg(s = s) // Error
<!INAPPLICABLE_CANDIDATE!>withVararg<!>(s = s) // Error
}
fun test_ann(s: String, arr: Array<String>) {
@@ -7,27 +7,27 @@ fun foo(vararg s: Int) {}
open class Cls(vararg p: Long)
fun test(i: IntArray) {
foo(s = 1)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = i)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = 1)
foo(s = i)
foo(s = *i)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = intArrayOf(1))
foo(s = intArrayOf(1))
foo(s = *intArrayOf(1))
foo(1)
Cls(p = 1)
<!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1)
class Sub : Cls(p = 1)
class Sub : <!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1)
val c = object : Cls(p = 1) {}
val c = object : <!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1) {}
foo(s = *intArrayOf(elements = 1))
foo(s = *<!INAPPLICABLE_CANDIDATE!>intArrayOf<!>(elements = 1))
}
fun anyFoo(vararg a: Any) {}
fun testAny() {
anyFoo(a = "")
<!INAPPLICABLE_CANDIDATE!>anyFoo<!>(a = "")
anyFoo(a = arrayOf(""))
anyFoo(a = *arrayOf(""))
}
@@ -35,12 +35,12 @@ fun testAny() {
fun <T> genFoo(vararg t: T) {}
fun testGen() {
genFoo<Int>(t = 1)
genFoo<Int?>(t = null)
<!INAPPLICABLE_CANDIDATE!>genFoo<!><Int>(t = 1)
<!INAPPLICABLE_CANDIDATE!>genFoo<!><Int?>(t = null)
genFoo<Array<Int>>(t = arrayOf())
genFoo<Array<Int>>(t = *arrayOf(arrayOf()))
genFoo(t = "")
<!INAPPLICABLE_CANDIDATE!>genFoo<!>(t = "")
genFoo(t = arrayOf(""))
genFoo(t = *arrayOf(""))
}
@@ -49,12 +49,12 @@ fun manyFoo(vararg v: Int) {}
fun manyFoo(vararg s: String) {}
fun testMany(a: Any) {
manyFoo(v = 1)
manyFoo(s = "")
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = 1)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = "")
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(a)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = a)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = a)
manyFoo(v = a as Int)
manyFoo(s = a as String)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = a as Int)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = a as String)
}
@@ -7,27 +7,27 @@ fun foo(vararg s: Int) {}
open class Cls(vararg p: Long)
fun test(i: IntArray) {
foo(s = 1)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = i)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = 1)
foo(s = i)
foo(s = *i)
<!INAPPLICABLE_CANDIDATE!>foo<!>(s = intArrayOf(1))
foo(s = intArrayOf(1))
foo(s = *intArrayOf(1))
foo(1)
Cls(p = 1)
<!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1)
class Sub : Cls(p = 1)
class Sub : <!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1)
val c = object : Cls(p = 1) {}
val c = object : <!INAPPLICABLE_CANDIDATE!>Cls<!>(p = 1) {}
foo(s = *intArrayOf(elements = 1))
foo(s = *<!INAPPLICABLE_CANDIDATE!>intArrayOf<!>(elements = 1))
}
fun anyFoo(vararg a: Any) {}
fun testAny() {
anyFoo(a = "")
<!INAPPLICABLE_CANDIDATE!>anyFoo<!>(a = "")
anyFoo(a = arrayOf(""))
anyFoo(a = *arrayOf(""))
}
@@ -35,12 +35,12 @@ fun testAny() {
fun <T> genFoo(vararg t: T) {}
fun testGen() {
genFoo<Int>(t = 1)
genFoo<Int?>(t = null)
<!INAPPLICABLE_CANDIDATE!>genFoo<!><Int>(t = 1)
<!INAPPLICABLE_CANDIDATE!>genFoo<!><Int?>(t = null)
genFoo<Array<Int>>(t = arrayOf())
genFoo<Array<Int>>(t = *arrayOf(arrayOf()))
genFoo(t = "")
<!INAPPLICABLE_CANDIDATE!>genFoo<!>(t = "")
genFoo(t = arrayOf(""))
genFoo(t = *arrayOf(""))
}
@@ -49,12 +49,12 @@ fun manyFoo(vararg v: Int) {}
fun manyFoo(vararg s: String) {}
fun testMany(a: Any) {
manyFoo(v = 1)
manyFoo(s = "")
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = 1)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = "")
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(a)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = a)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = a)
manyFoo(v = a as Int)
manyFoo(s = a as String)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(v = a as Int)
<!INAPPLICABLE_CANDIDATE!>manyFoo<!>(s = a as String)
}
@@ -45,5 +45,5 @@ fun foo(vararg i: Int) {}
@Ann(s = "value")
fun dep1() {
foo(i = 1)
<!INAPPLICABLE_CANDIDATE!>foo<!>(i = 1)
}
@@ -15,6 +15,6 @@ fun f2() {}
fun foo(vararg ints: Int) {}
fun test() {
foo(ints = 1)
<!INAPPLICABLE_CANDIDATE!>foo<!>(ints = 1)
foo(ints = *intArrayOf(1))
}