[FIR] Resolve infix calls to infix functions only

Implements INFIX_MODIFIER_REQUIRED diagnostics
This commit is contained in:
Andrey Zinovyev
2021-05-14 15:22:43 +03:00
committed by TeamCityServer
parent df14deb5a0
commit b1c8669b43
46 changed files with 174 additions and 94 deletions
+5 -5
View File
@@ -18,21 +18,21 @@ fun Example.withLambda(f: () -> Unit) = Pair(this, f)
fun test() {
Example() to Example()
Example() toNonInfix Example()
Example() <!INFIX_MODIFIER_REQUIRED!>toNonInfix<!> Example()
Example().toNonInfix(Example())
val a = Example()
val b = Example()
a toExt b
a toExtNonInfix b
a <!INFIX_MODIFIER_REQUIRED!>toExtNonInfix<!> b
a.toExtNonInfix(b)
a toExtWithExtraParams b
a toExtNonInfixWithExtraParams b
a <!INFIX_MODIFIER_REQUIRED!>toExtNonInfixWithExtraParams<!> b
a toExtDefaultValues b
a toExtNonInfixDefaultValues b
a <!INFIX_MODIFIER_REQUIRED!>toExtNonInfixDefaultValues<!> b
a withLambda { }
a <!INFIX_MODIFIER_REQUIRED!>withLambda<!> { }
}
@@ -12,7 +12,7 @@ fun test(a: Any) {
1ffoo a
1doo a
1ddoo a
1contains a
1<!INFIX_MODIFIER_REQUIRED!>contains<!> a
1Lfoo a
1L<!UNRESOLVED_REFERENCE!>oo<!> a
@@ -1,10 +0,0 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE, -UNUSED_PARAMETER
infix fun Int.rem(other: Int) = 10
infix operator fun Int.minus(other: Int): Int = 20
const val a1 = (-5) rem 2
const val a2 = (-5).rem(2)
const val b1 = 5 minus 3
const val b2 = 5.minus(3)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE, -UNUSED_PARAMETER
infix fun Int.rem(other: Int) = 10
@@ -4,23 +4,23 @@ fun fooByte(p: Byte) = p
fun fooShort(p: Short) = p
fun test() {
fooInt(1 plus 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 plus 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 plus 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 plus 1<!>)
fooInt(1 <!INFIX_MODIFIER_REQUIRED!>plus<!> 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>plus<!> 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>plus<!> 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>plus<!> 1<!>)
fooInt(1 times 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 times 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 times 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 times 1<!>)
fooInt(1 <!INFIX_MODIFIER_REQUIRED!>times<!> 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>times<!> 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>times<!> 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>times<!> 1<!>)
fooInt(1 div 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 div 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 div 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 div 1<!>)
fooInt(1 <!INFIX_MODIFIER_REQUIRED!>div<!> 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>div<!> 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>div<!> 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>div<!> 1<!>)
fooInt(1 rem 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 rem 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 rem 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 rem 1<!>)
fooInt(1 <!INFIX_MODIFIER_REQUIRED!>rem<!> 1)
fooByte(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>rem<!> 1<!>)
fooLong(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>rem<!> 1<!>)
fooShort(<!ARGUMENT_TYPE_MISMATCH!>1 <!INFIX_MODIFIER_REQUIRED!>rem<!> 1<!>)
}
+2 -2
View File
@@ -25,7 +25,7 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) {
{
s(11)
s.invoke(11)
s invoke 11
s <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
}()
}
@@ -33,7 +33,7 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit) {
{
s(11)
s.invoke(11)
s invoke 11
s <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
}()
}
@@ -1,26 +0,0 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {
s(11)
s.invoke(11)
s invoke 11
11.ext(11)
11 ext 11
}
inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {
s(11)
s.invoke(11)
s invoke 11
11.ext(11)
11 ext 11
}
inline fun Function1<Int, Unit>.inlineExt() {
invoke(11)
this.invoke(11)
this invoke 11
this(11)
}
+1
View File
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {
@@ -3,13 +3,13 @@
inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) {
(s)(11)
(s).invoke(11)
(s) invoke 11
(s) <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
(<!USAGE_IS_NOT_INLINABLE!>s<!>)
}
inline fun Function1<Int, Unit>.inlineExt() {
(this).invoke(11)
(this) invoke 11
(this) <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
(this)(11)
(this)
}
@@ -17,7 +17,7 @@ inline fun Function1<Int, Unit>.inlineExt() {
inline fun inlineFunWithInvoke2(s: (p: Int) -> Unit) {
(((s)))(11)
(((s))).invoke(11)
(((s))) invoke 11
(((s))) <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
(((<!USAGE_IS_NOT_INLINABLE!>s<!>)))
}
+5 -5
View File
@@ -17,10 +17,10 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {
Test().test(){
s(11)
s.invoke(11)
s invoke 11
s <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
11.ext(11)
11 ext 11
11 <!INFIX_MODIFIER_REQUIRED!>ext<!> 11
<!USAGE_IS_NOT_INLINABLE!>s<!>
<!USAGE_IS_NOT_INLINABLE!>ext<!>
@@ -32,10 +32,10 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.(
Test().test(){
s(11)
s.invoke(11)
s invoke 11
s <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
11.ext(11)
11 ext 11
11 <!INFIX_MODIFIER_REQUIRED!>ext<!> 11
s
<!USAGE_IS_NOT_INLINABLE!>ext<!>
@@ -48,7 +48,7 @@ inline fun Function1<Int, Unit>.inlineExt() {
Test().test(){
invoke(11)
this.invoke(11)
this invoke 11
this <!INFIX_MODIFIER_REQUIRED!>invoke<!> 11
this(11)
this
@@ -24,13 +24,13 @@ fun a() {
consumeInt(<!ARGUMENT_TYPE_MISMATCH!>a - b<!>)
consumeString(a plus b)
consumeInt(<!ARGUMENT_TYPE_MISMATCH!>a minus b<!>)
consumeInt(a minus b)
a * b
a / b
a times b
a div b
a <!INFIX_MODIFIER_REQUIRED!>div<!> b
}
}
}
@@ -26,7 +26,7 @@ fun a() {
a plus b
a minus b
a times b
a div b
a <!INFIX_MODIFIER_REQUIRED!>div<!> b
with (Example()) {
consumeInt(this + a)
@@ -35,9 +35,9 @@ fun a() {
consumeInt(this / b)
consumeInt(this plus a)
consumeString(<!ARGUMENT_TYPE_MISMATCH!>this minus b<!>)
consumeString(this minus b)
consumeInt(this times a)
consumeInt(this div b)
consumeInt(this <!INFIX_MODIFIER_REQUIRED!>div<!> b)
}
}
@@ -37,7 +37,7 @@ fun test() {
consumeExample2(<!ARGUMENT_TYPE_MISMATCH!>++a<!>)
consumeString(<!ARGUMENT_TYPE_MISMATCH!>a plus b<!>)
consumeString(a plus b)
}
fun consumeInt(i: Int) {}
@@ -41,13 +41,13 @@ fun test() {
platformN + 1
platformJ + 1
1 plus platformNN
1 plus platformN
1 plus platformJ
1 <!INFIX_MODIFIER_REQUIRED!>plus<!> platformNN
1 <!INFIX_MODIFIER_REQUIRED!>plus<!> platformN
1 <!INFIX_MODIFIER_REQUIRED!>plus<!> platformJ
platformNN plus 1
platformN plus 1
platformJ plus 1
platformNN <!INFIX_MODIFIER_REQUIRED!>plus<!> 1
platformN <!INFIX_MODIFIER_REQUIRED!>plus<!> 1
platformJ <!INFIX_MODIFIER_REQUIRED!>plus<!> 1
platformNN += 1
platformN += 1