[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:
committed by
Space Team
parent
2e66954d01
commit
931f2eab58
@@ -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() {
|
||||
|
||||
+184
@@ -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
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
}<!>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
|
||||
-13
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user