[FIR] Remove implicit coercion of ifs and whens to Unit

The rule of thumb is the following:
If the `if` and `when` can be successfully replaced with `while`,
then it is used as a statement, otherwise, it is used as an expression.

#KT-59883
This commit is contained in:
Evgeniy.Zhelenskiy
2024-02-20 03:12:56 +01:00
committed by Space Team
parent 2e66954d01
commit 931f2eab58
16 changed files with 256 additions and 68 deletions
@@ -71,7 +71,7 @@ fun main1() {
1.<!ILLEGAL_SELECTOR!>"sdf"<!>
1.<!ILLEGAL_SELECTOR!>{}<!>
1.<!ILLEGAL_SELECTOR!><!INVALID_IF_AS_EXPRESSION!>if<!> (true) {}<!>
1.<!ILLEGAL_SELECTOR!>if (true) {}<!>
}
fun test() {
@@ -0,0 +1,184 @@
// FIR_IDENTICAL
// DIAGNOSTICS: -UNUSED_EXPRESSION
fun ifExpr() = try {
if (true) 2
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 2
} catch (e: Exception) {
if (true) 3
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 3
} catch (e: Throwable) {
if (true) 4
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 4
} finally {
if (true) 5
if (true) 5
}
fun ifBlock() = try {
if (true) {
2
}
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {
2
}
} catch (e: Exception) {
if (true) {
3
}
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {
3
}
} catch (e: Throwable) {
if (true) {
4
}
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {
4
}
} finally {
if (true) {
5
}
if (true) {
5
}
}
fun whenExpr() = try {
when {
true -> 2
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> 2
}
} catch (e: Exception) {
when {
true -> 3
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> 3
}
} catch (e: Throwable) {
when {
true -> 4
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> 4
}
} finally {
when {
true -> 5
}
when {
true -> 5
}
}
fun whenBlock() = try {
when {
true -> {
2
}
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> {
2
}
}
} catch (e: Exception) {
when {
true -> {
3
}
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> {
3
}
}
} catch (e: Throwable) {
when {
true -> {
4
}
}
<!NO_ELSE_IN_WHEN!>when<!> {
true -> {
4
}
}
} finally {
when {
true -> {
5
}
}
when {
true -> {
5
}
}
}
fun ifExpr2(): Any {
try {
if (true) 2
if (true) 2
} catch (e: Exception) {
if (true) 3
if (true) 3
} catch (e: Throwable) {
if (true) 4
if (true) 4
} finally {
if (true) 5
if (true) 5
}
return try {
if (true) 2
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 2
} catch (e: Exception) {
if (true) 3
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 3
} catch (e: Throwable) {
if (true) 4
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) 4
} finally {
if (true) 5
if (true) 5
}
}
fun ifExpr3() {
try {
if (true) 2
if (true) 2
} catch (e: Exception) {
if (true) 3
if (true) 3
} catch (e: Throwable) {
if (true) 4
if (true) 4
} finally {
if (true) 5
if (true) 5
}
try {
if (true) 2
if (true) 2
} catch (e: Exception) {
if (true) 3
if (true) 3
} catch (e: Throwable) {
if (true) 4
if (true) 4
} finally {
if (true) 5
if (true) 5
}
}
@@ -18,7 +18,7 @@ fun testMixedIfAndWhen() =
fun testWrappedExpressions() =
if (true) {
println()
if (true) {
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) {
println()
if (true) {
println()
@@ -1,11 +1,11 @@
package f
fun test(a: Boolean, b: Boolean): Int {
return <!RETURN_TYPE_MISMATCH!>if(a) {
return if(a) {
1
} else {
if (b) {
<!INVALID_IF_AS_EXPRESSION!>if<!> (b) {
3
}
}<!>
}
}
-37
View File
@@ -1,37 +0,0 @@
/*
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
*
* SPEC VERSION: 0.1-152
* PRIMARY LINKS: expressions, when-expression -> paragraph 5 -> sentence 1
* expressions, when-expression, exhaustive-when-expressions -> paragraph 1 -> sentence 1
* expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
* expressions, when-expression -> paragraph 6 -> sentence 5
*/
// KT-4434 Missed diagnostic about else branch in when
package test
fun foo(): Int {
val a = "a"
return <!RETURN_TYPE_MISMATCH!>if (a.length > 0) {
when (a) {
"a" -> 1
}
}
else {
3
}<!>
}
fun bar(): Int {
val a = "a"
if (a.length > 0) {
return <!NO_ELSE_IN_WHEN!>when<!> (a) {
"a" -> 1
}
}
else {
return 3
}
}
+1
View File
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
/*
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
*
@@ -1,13 +0,0 @@
// SKIP_TXT
fun bar(a: String): String {
return <!RETURN_TYPE_MISMATCH!>when {
a.length == 1 -> {
when { // Error in K1, no error in K2
a == "a" -> ""
a == "b" -> ""
}
}
else -> ""
}<!>
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// SKIP_TXT
fun bar(a: String): String {
return when {