[Spec tests] Add test for infix fun + KT-36786

This commit is contained in:
anastasiia.spaseeva
2020-02-17 17:50:43 +03:00
committed by Victor Petukhov
parent c9bb994fb5
commit 4301744d2d
8 changed files with 389 additions and 0 deletions
@@ -0,0 +1,33 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)
*
* SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call
* NUMBER: 1
* DESCRIPTION: Not null Smartcast doesn't work in case of property infix call
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-36786
*/
class C() {
infix operator fun invoke(i: Int) { } //(1)
}
class B(val memberValCNull: C? = null) {
infix fun bar(i: Int) {}
}
// TESTCASE NUMBER: 1
fun case1() {
val b: B = B()
// b memberValCNull 1 //nok (UNSAFE_INFIX_CALL)
// b.memberValCNull.invoke(1) //nok (UNSAFE_CALL)
if (b.memberValCNull != null) {
b <!UNSAFE_INFIX_CALL!>memberValCNull<!> 1 //nok (UNSAFE_INFIX_CALL) !!!!
<!DEBUG_INFO_SMARTCAST!>b.memberValCNull<!>.invoke(2) //ok
b.<!UNSAFE_IMPLICIT_INVOKE_CALL!>memberValCNull<!>(3) //nok (UNSAFE_CALL) !!!
}
}
@@ -0,0 +1,33 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)
*
* SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call
* NUMBER: 2
* DESCRIPTION: is-check Smartcast doesn't work in case of property infix call
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-36786
*/
class B(val memberVal: Any)
class C() {
infix operator fun invoke(i: Int) { } //(1)
}
// TESTCASE NUMBER: 1
fun case1() {
val b: B = B(C())
b <!UNRESOLVED_REFERENCE!>memberVal<!> 1 //nok UNRESOLVED_REFERENCE
b.memberVal.<!UNRESOLVED_REFERENCE!>invoke<!>(2) //nok UNRESOLVED_REFERENCE
b.<!FUNCTION_EXPECTED!>memberVal<!>(1) //nok FUNCTION_EXPECTED
if (b.memberVal is C) {
b <!UNRESOLVED_REFERENCE!>memberVal<!> 1 //nok UNRESOLVED_REFERENCE !!!!
<!DEBUG_INFO_SMARTCAST!>b.memberVal<!>.invoke(1) //ok
b.<!FUNCTION_EXPECTED!>memberVal<!>(1) //nok FUNCTION_EXPECTED !!!
<!DEBUG_INFO_SMARTCAST!>(b.memberVal)<!>(1) //ok
}
}
@@ -0,0 +1,34 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)
*
* SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call
* NUMBER: 3
* DESCRIPTION: "Unsafe" cast doesn't work in case of property infix call
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-36786
*/
class B(val memberVal: Any)
class C() {
infix operator fun invoke(i: Int) { } //(1)
}
// TESTCASE NUMBER: 1
fun case1() {
val b: B = B(C())
b <!UNRESOLVED_REFERENCE!>memberVal<!> 1 //nok UNRESOLVED_REFERENCE
b.memberVal.<!UNRESOLVED_REFERENCE!>invoke<!>(2) //nok UNRESOLVED_REFERENCE
b.<!FUNCTION_EXPECTED!>memberVal<!>(1) //nok FUNCTION_EXPECTED
b.memberVal as C
b <!UNRESOLVED_REFERENCE!>memberVal<!> 1 //nok UNRESOLVED_REFERENCE !!!!
<!DEBUG_INFO_SMARTCAST!>b.memberVal<!>.invoke(1) //ok
b.<!FUNCTION_EXPECTED!>memberVal<!>(1) //nok FUNCTION_EXPECTED !!!
<!DEBUG_INFO_SMARTCAST!>(b.memberVal)<!>(1) //ok
}
@@ -0,0 +1,109 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)
*
* SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call
* NUMBER: 4
* DESCRIPTION: Local extension infix extension callables
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-36786
*/
// TESTCASE NUMBER: 1, 2
// FILE: infixLib.kt
package libPackage
class C() {
infix operator fun invoke(i: Int) {}
}
class B() {
val barC: C = TODO()
val B.<!EXTENSION_SHADOWED_BY_MEMBER!>barC<!>: C
get() = TODO()
infix fun fooC(i: Int) = {}
infix fun B.<!EXTENSION_SHADOWED_BY_MEMBER!>fooC<!>(i: Int) =
{}
}
infix fun B.<!EXTENSION_SHADOWED_BY_MEMBER!>fooC<!>(i: Int) = {}
val B.<!EXTENSION_SHADOWED_BY_MEMBER!>barC<!>: C
get() = TODO()
// FILE: TestCase1.kt
/*
* TESTCASE NUMBER: 1
* NOTE: should be resolved to member properties, others should be shadowed by member function
*/
package testPackInfix
import libPackage.C
import libPackage.B
import libPackage.*
fun case1() {
class Case() {
val B.<!EXTENSION_SHADOWED_BY_MEMBER!>barC<!>: C
get() = TODO()
fun case() {
val b = B()
<!DEBUG_INFO_CALL("fqName: libPackage.B.fooC; typeCall: infix function")!>b fooC 3<!>
<!DEBUG_INFO_CALL("fqName: libPackage.C.invoke; typeCall: variable&invoke")!>b barC 3<!>
}
}
fun case() {
val b = B()
<!DEBUG_INFO_CALL("fqName: libPackage.B.fooC; typeCall: infix function")!>b fooC 3<!>
<!DEBUG_INFO_CALL("fqName: libPackage.C.invoke; typeCall: variable&invoke")!>b barC 3<!>
}
}
// FILE: TestCase2.kt
/*
* TESTCASE NUMBER: 2
* NOTE: should be resolved to member properties, others should be shadowed by member property with invoke or by member function
*/
package testPackInfix
import libPackage.C
import libPackage.B
import libPackage.*
import libPackage.fooC
import libPackage.barC
/*should be shadowed by member function*/
infix fun B.<!EXTENSION_SHADOWED_BY_MEMBER!>fooC<!>(i: Int) = {}
/*should be shadowed by member property with invoke*/
infix fun B.<!EXTENSION_FUNCTION_SHADOWED_BY_MEMBER_PROPERTY_WITH_INVOKE!>barC<!>(i: Int) = {}
/*should be shadowed by member property*/
val B.<!EXTENSION_SHADOWED_BY_MEMBER!>barC<!>: C
get() = TODO()
fun case2() {
class Case() {
/*should be shadowed by member property*/
val B.<!EXTENSION_SHADOWED_BY_MEMBER!>barC<!>: C
get() = TODO()
/*should be shadowed by member property with invoke*/
infix fun B.<!EXTENSION_FUNCTION_SHADOWED_BY_MEMBER_PROPERTY_WITH_INVOKE!>barC<!>(i: Int) = {}
/*should be shadowed by member function*/
infix fun B.<!EXTENSION_SHADOWED_BY_MEMBER!>fooC<!>(i: Int) = {}
fun case() {
val b = B()
<!DEBUG_INFO_CALL("fqName: libPackage.B.fooC; typeCall: infix function")!>b fooC 3<!>
<!DEBUG_INFO_CALL("fqName: libPackage.C.invoke; typeCall: variable&invoke")!>b barC 3<!>
}
}
fun case() {
val b = B()
<!DEBUG_INFO_CALL("fqName: libPackage.B.fooC; typeCall: infix function")!>b fooC 3<!>
<!DEBUG_INFO_CALL("fqName: libPackage.C.invoke; typeCall: variable&invoke")!>b barC 3<!>
}
}