FIR checkers: report specific errors instead of INAPPLICABLE_CANDIDATE

Specifically, the report the following 4 errors.

* NON_VARARG_SPREAD
* ARGUMENT_PASSED_TWICE
* TOO_MANY_ARGUMENTS
* NO_VALUE_FOR_PARAMETER

Also added/updated the following position strategies.
* NAME_OF_NAMED_ARGUMENT
* VALUE_ARGUMENTS
This commit is contained in:
Tianyu Geng
2021-03-04 14:01:32 -08:00
committed by Mikhail Glukhikh
parent fc8d0e3ee0
commit 761a0a7d0d
143 changed files with 526 additions and 470 deletions
@@ -1,7 +1,7 @@
fun test1(f: String.() -> Unit) {
(<!INAPPLICABLE_CANDIDATE!>f<!>)()
(f)(<!NO_VALUE_FOR_PARAMETER!>)<!>
<!INAPPLICABLE_CANDIDATE!>f<!>()
f(<!NO_VALUE_FOR_PARAMETER!>)<!>
}
fun test2(f: (Int) -> Int) {
@@ -7,7 +7,7 @@ fun test1() {
fun test2(f: String.(Int) -> Unit) {
11.(<!INAPPLICABLE_CANDIDATE!>f<!>)(1)
11.(<!INAPPLICABLE_CANDIDATE!>f<!>)()
11.(f)(<!NO_VALUE_FOR_PARAMETER!>)<!>
}
fun test3() {
@@ -8,7 +8,7 @@ class SomeClass
fun test(identifier: SomeClass, fn: String.() -> Unit) {
<!NONE_APPLICABLE!>identifier<!>()
<!INAPPLICABLE_CANDIDATE!>identifier<!>(123)
<!INAPPLICABLE_CANDIDATE!>identifier<!>(1, 2)
identifier(123<!NO_VALUE_FOR_PARAMETER!>)<!>
identifier(1, <!TOO_MANY_ARGUMENTS!>2<!>)
1.<!INAPPLICABLE_CANDIDATE!>fn<!>()
}
@@ -11,10 +11,10 @@ fun test(a: A) {
<!UNSAFE_IMPLICIT_INVOKE_CALL!>(a.x)<!>("")
with("") {
a.<!INAPPLICABLE_CANDIDATE!>x<!>()
<!INAPPLICABLE_CANDIDATE!>(a.x)<!>()
a.x(<!NO_VALUE_FOR_PARAMETER!>)<!>
(a.x)(<!NO_VALUE_FOR_PARAMETER!>)<!>
if (a.x != null) {
a.<!INAPPLICABLE_CANDIDATE!>x<!>() // todo
a.x(<!NO_VALUE_FOR_PARAMETER!>)<!> // todo
(a.x)()
}
}
@@ -24,8 +24,8 @@ fun test(a: A, b: B) {
}
with(b) {
a.<!INAPPLICABLE_CANDIDATE!>foo<!>()
a.(<!INAPPLICABLE_CANDIDATE!>foo<!>)()
a.foo(<!NO_VALUE_FOR_PARAMETER!>)<!>
a.(foo)(<!NO_VALUE_FOR_PARAMETER!>)<!>
(a.foo)()
@@ -66,8 +66,8 @@ fun test(a: A, b: B) {
}
with(b) {
a.<!INAPPLICABLE_CANDIDATE!>foo<!>()
a.(<!INAPPLICABLE_CANDIDATE!>foo<!>)()
a.foo(<!NO_VALUE_FOR_PARAMETER!>)<!>
a.(foo)(<!NO_VALUE_FOR_PARAMETER!>)<!>
(a.foo)()
@@ -1,17 +0,0 @@
class A {
val foo: B.() -> Unit get() = null!!
}
class B
fun test(a: A, b: B) {
with(b) {
a.<!INAPPLICABLE_CANDIDATE!>foo<!>() // here must be error, because a is not extension receiver
a.foo(this)
(a.foo)()
(a.foo)(this)
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
class A {
val foo: B.() -> Unit get() = null!!
}
@@ -7,7 +7,7 @@ class SomeClass
fun test(identifier: SomeClass, fn: String.() -> Unit) {
<!INAPPLICABLE_CANDIDATE!>identifier<!>()
<!INAPPLICABLE_CANDIDATE!>identifier<!>(123)
<!INAPPLICABLE_CANDIDATE!>identifier<!>(1, 2)
identifier(<!TOO_MANY_ARGUMENTS!>123<!>)
identifier(<!TOO_MANY_ARGUMENTS!>1<!>, <!TOO_MANY_ARGUMENTS!>2<!>)
1.<!INAPPLICABLE_CANDIDATE!>fn<!>()
}