Add call checks related to suspend lambda modifier's introduction

- Prohibit non-modifier-like calls on kotlin.suspend
- Add warning on modifier-like calls to anything but kotlin.suspend

 #KT-22766 In Progress
 #KT-22562 In Progress
This commit is contained in:
Denis Zharkov
2018-01-25 13:46:56 +03:00
parent ef01f641f3
commit 99c7d8d4d5
10 changed files with 330 additions and 1 deletions
@@ -0,0 +1,74 @@
// SKIP_TXT
fun <R> suspend(block: suspend () -> R): suspend () -> R = block
class A {
infix fun <R> suspend(block: suspend () -> R): suspend () -> R = block
}
@Target(AnnotationTarget.EXPRESSION)
annotation class Ann
fun bar() {
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
@Ann <!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> @Ann {
println()
}
suspend() {
println()
}
suspend({ println() })
suspend<Unit> {
println()
}
val <!UNUSED_VARIABLE!>w<!>: (suspend () -> Int) -> Any? = ::suspend
A().<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
A().suspend() {
println()
}
A().suspend({ println() })
A().suspend<Unit> {
println()
}
with(A()) {
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
suspend() {
println()
}
suspend({ println() })
suspend<Unit> {
println()
}
}
A() <!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
A() suspend ({
println()
})
}
@@ -0,0 +1,82 @@
// SKIP_TXT
fun <R> suspend(block: R) = block
class A {
infix fun <R> suspend(block: R) = block
}
@Target(AnnotationTarget.EXPRESSION)
annotation class Ann
fun bar() {
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
@Ann <!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> @Ann {
println()
}
suspend() {
println()
}
suspend({ println() })
suspend<suspend () -> Unit> {
println()
}
suspend<Nothing?>(null)
val <!UNUSED_VARIABLE!>w<!>: (Any?) -> Any? = ::suspend
A().<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
A().suspend() {
println()
}
A().suspend({ println() })
A().suspend<suspend () -> Unit> {
println()
}
A().suspend<Nothing?>(null)
with(A()) {
<!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
suspend() {
println()
}
suspend({ println() })
suspend<suspend () -> Unit> {
println()
}
suspend<Nothing?>(null)
}
A() <!MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND!>suspend<!> {
println()
}
A() suspend ({
println()
})
A() suspend ""
}
@@ -0,0 +1,33 @@
// SKIP_TXT
fun bar() {
suspend {
println()
}
@Ann suspend {
println()
}
suspend @Ann {
println()
}
kotlin.<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!> {
}
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!>() {
println()
}
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!>({ println() })
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!><Unit> {
println()
}
val <!UNUSED_VARIABLE!>w<!>: (suspend () -> Int) -> Any? = ::<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!>
}
@Target(AnnotationTarget.EXPRESSION)
annotation class Ann
@@ -0,0 +1,28 @@
// SKIP_TXT
import kotlin.suspend as suspendLambda
fun bar() {
<!UNRESOLVED_REFERENCE!>suspend<!> {
println()
}
kotlin.<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspend<!> {
}
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspendLambda<!> {
println()
}
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspendLambda<!>() {
println()
}
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspendLambda<!>({ println() })
<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspendLambda<!><Unit> {
println()
}
val <!UNUSED_VARIABLE!>w<!>: (suspend () -> Int) -> Any? = ::<!NON_MODIFIER_FORM_FOR_BUILT_IN_SUSPEND!>suspendLambda<!>
}