[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
@@ -1,31 +0,0 @@
fun inlineCall(): String {
inlineFun {
if (true) {
return@inlineCall ""
}
1
}
return "x"
}
inline fun inlineFun(s: ()->Int) {
s()
}
fun noInlineCall(): String {
noInline {
if (true) {
return@noInlineCall ""
}
1
}
return "x"
}
fun noInline(s: ()->Int) {
s()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
fun inlineCall(): String {
inlineFun {
if (true) {
@@ -1,10 +0,0 @@
// !DIAGNOSTICS: -NOTHING_TO_INLINE
fun main() {
test {
return
}
}
inline fun test(noinline lambda: () -> Unit) {
lambda()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -NOTHING_TO_INLINE
fun main() {
test {
@@ -1,43 +0,0 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
fun <R> fun1(p: () -> R) {
inlineFun {
p()
}
}
fun <R> fun1ValueArgument(p: () -> R) {
inlineFun ({
p()
})
}
fun <R> fun3(p: () -> R) {
inlineFun {
return;
}
}
fun <R> fun3ValueArgument(p: () -> R) {
inlineFun ({
return;
})
}
fun <R> fun4(p: () -> R) {
inlineFun lambda@ {
return@lambda p();
}
}
fun <R> fun4ValueArgument(p: () -> R) {
inlineFun (lambda@ {
return@lambda p();
})
}
inline fun <R> inlineFun(crossinline p: () -> R) {
p()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
fun <R> fun1(p: () -> R) {
@@ -1,25 +0,0 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
class Z {
inline infix fun <R> inlineFun(crossinline p: () -> R) {
p()
}
}
fun <R> fun1(p: () -> R) {
Z() inlineFun {
p()
}
}
fun <R> fun3(p: () -> R) {
Z() inlineFun {
return;
}
}
fun <R> fun4(p: () -> R) {
Z() inlineFun lambda@ {
return@lambda p();
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
class Z {
@@ -1,24 +0,0 @@
inline fun <R> doCall(p: () -> R) {
p()
}
inline fun <R> doCallInt(p: () -> R): R {
return p()
}
class A {
var result: Int = doCallInt { return this };
var field: Int
get() {
doCall { return 1 }
return 2
}
set(v: Int) {
doCall {
result = v / 2
return
}
result = v
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
inline fun <R> doCall(p: () -> R) {
p()
}