[FIR] Implement FirReturnAllowedChecker

Supported diagnostics:
- RETURN_NOT_ALLOWED
- RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY
This commit is contained in:
Dmitriy Novozhilov
2021-04-05 10:15:21 +03:00
committed by TeamCityServer
parent 254ff77977
commit 3cb17ac2f0
59 changed files with 263 additions and 343 deletions
@@ -16,15 +16,15 @@ suspend fun baz() {
}
foo2 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
foo3 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
foo4 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
bar1 {
@@ -32,14 +32,14 @@ suspend fun baz() {
}
bar2 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
bar3 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
bar4 {
return@baz
<!RETURN_NOT_ALLOWED!>return@baz<!>
}
}
@@ -1,51 +0,0 @@
// !LANGUAGE: +NewInference +OverloadResolutionByLambdaReturnType
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_EXPRESSION -EXPERIMENTAL_API_USAGE -EXPERIMENTAL_UNSIGNED_LITERALS
// ISSUE: KT-11265
// FILE: OverloadResolutionByLambdaReturnType.kt
package kotlin
annotation class OverloadResolutionByLambdaReturnType
// FILE: main.kt
import kotlin.OverloadResolutionByLambdaReturnType
inline fun <T, R> Array<out T>.myFlatMap(transform: (T) -> Iterable<R>): List<R> {
TODO()
}
@OverloadResolutionByLambdaReturnType
@JvmName("seqFlatMap")
inline fun <T, R> Array<out T>.myFlatMap(transform: (T) -> Sequence<R>): List<R> {
TODO()
}
fun String.toList(): List<String> = null!!
fun test_1(a: Array<String>, b: Boolean) {
a.myFlatMap { it.toList().ifEmpty { return } }
a.myFlatMap {
if (b) return
it.toList()
}
}
fun <T, R> Array<out T>.noInlineFlatMap(transform: (T) -> Iterable<R>): List<R> {
TODO()
}
@OverloadResolutionByLambdaReturnType
@JvmName("noInlineSeqFlatMap")
fun <T, R> Array<out T>.noInlineFlatMap(transform: (T) -> Sequence<R>): List<R> {
TODO()
}
fun test_2(a: Array<String>, b: Boolean) {
a.noInlineFlatMap { it.toList().ifEmpty { return } }
a.noInlineFlatMap {
if (b) return
it.toList()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +NewInference +OverloadResolutionByLambdaReturnType
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_EXPRESSION -EXPERIMENTAL_API_USAGE -EXPERIMENTAL_UNSIGNED_LITERALS
// ISSUE: KT-11265
@@ -0,0 +1,20 @@
// FIR_IDENTICAL
fun testArray(b: Boolean) {
Array(5) { i ->
if (b) return
i
}
throw AssertionError()
}
fun testMyArray(b: Boolean) {
MyArray(5) { i ->
if (b) <!RETURN_NOT_ALLOWED!>return<!>
i
}
throw AssertionError()
}
class MyArray<T> {
constructor(size: Int, init: (Int) -> T)
}
@@ -0,0 +1,11 @@
package
public fun testArray(/*0*/ b: kotlin.Boolean): kotlin.Unit
public fun testMyArray(/*0*/ b: kotlin.Boolean): kotlin.Unit
public final class MyArray</*0*/ T> {
public constructor MyArray</*0*/ T>(/*0*/ size: kotlin.Int, /*1*/ init: (kotlin.Int) -> T)
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}