FIR: don't emit SENSELESS_NULL_IN_WHEN when value is always null

This case (value is always null) contradicts the error message which says
"Expression under 'when' is never equal to null".
This commit is contained in:
pyos
2022-11-08 14:26:49 +01:00
committed by teamcity
parent fbb54f0300
commit e7b4927b6c
5 changed files with 10 additions and 9 deletions
@@ -131,8 +131,9 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() {
}
}
// We only report `SENSELESS_NULL_IN_WHEN` if `lType = type` because `lType` is the type of the when subject. This diagnostic is
// only intended for cases where the branch condition contains a null.
if (expression.source?.elementType != KtNodeTypes.BINARY_EXPRESSION && type === lType) {
// only intended for cases where the branch condition contains a null. Also, the error message for SENSELESS_NULL_IN_WHEN
// says the value is *never* equal to null, so we can't report it if the value is *always* equal to null.
if (expression.source?.elementType != KtNodeTypes.BINARY_EXPRESSION && type === lType && !compareResult) {
reporter.reportOn(expression.source, FirErrors.SENSELESS_NULL_IN_WHEN, context)
} else {
reporter.reportOn(expression.source, FirErrors.SENSELESS_COMPARISON, expression, compareResult, context)
@@ -3,7 +3,7 @@
// exhaustive
fun test1(n: Nothing) = when (n) { }
fun test2(n: Nothing?) = when (n) {
<!SENSELESS_NULL_IN_WHEN!>null<!> -> {}
<!SENSELESS_COMPARISON!>null<!> -> {}
}
// not exhaustive
@@ -218,7 +218,7 @@ fun case_23(value_1: Nothing) {
// TESTCASE NUMBER: 24
fun case_24(value_1: Nothing?) = when (value_1) {
<!SENSELESS_COMPARISON!>throw Exception()<!>, <!SENSELESS_COMPARISON!><!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> ""<!> -> ""
<!SENSELESS_NULL_IN_WHEN!>null<!>, <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> "", throw throw throw Exception() -> ""
<!SENSELESS_COMPARISON!>null<!>, <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> <!RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY!>return<!> "", throw throw throw Exception() -> ""
else -> ""
}
@@ -199,7 +199,7 @@ fun case_17(x: Boolean?, y: Boolean?) {
else -> if (true) if (true) if (true) if (true) if (true) x!! else x!! else x!! else x!! else x!! else x!!
}
<!SENSELESS_COMPARISON!>false<!> -> x!!
<!SENSELESS_NULL_IN_WHEN!>null<!> -> if (true) if (true) if (true) if (true) if (true) x!! else x!! else x!! else x!! else x!! else x!!
<!SENSELESS_COMPARISON!>null<!> -> if (true) if (true) if (true) if (true) if (true) x!! else x!! else x!! else x!! else x!! else x!!
} else x!! else x!! else x!! else x!! else x!!
}
break@loop
@@ -154,7 +154,7 @@ fun case_10(x: Any): String {
fun case_11(x: Any?): String? {
if (x is Nothing?) {
return when(x) {
<!SENSELESS_NULL_IN_WHEN!>null<!> -> null
<!SENSELESS_COMPARISON!>null<!> -> null
}
}
return ""
@@ -168,7 +168,7 @@ fun case_11(x: Any?): String? {
fun case_12(x: Any?): String? {
if (x == null) {
return when(x) {
<!SENSELESS_NULL_IN_WHEN!>null<!> -> null
<!SENSELESS_COMPARISON!>null<!> -> null
}
}
return ""
@@ -182,7 +182,7 @@ fun case_12(x: Any?): String? {
fun case_13(x: Any?): String? {
if (x === null) {
return when(x) {
<!SENSELESS_NULL_IN_WHEN!>null<!> -> null
<!SENSELESS_COMPARISON!>null<!> -> null
}
}
return ""
@@ -196,7 +196,7 @@ fun case_13(x: Any?): String? {
fun case_14(x: Any?): String? {
x as Nothing?
return when(x) {
<!SENSELESS_NULL_IN_WHEN!>null<!> -> null
<!SENSELESS_COMPARISON!>null<!> -> null
}
}