[FIR] Don't miss smartcast info on equalities with when subjects
Since they are not `FirSmartCastExpression`s, they are treated as proper original types, thus leading to reporting errors instead of warnings. ^KT-60095 Fixed
This commit is contained in:
committed by
Space Team
parent
4f96171716
commit
f5d859f209
+8
-6
@@ -19,10 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInterface
|
||||
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.isPrimitiveType
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
@@ -38,8 +35,8 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() {
|
||||
val arguments = expression.argumentList.arguments
|
||||
require(arguments.size == 2) { "Equality operator call with non-2 arguments" }
|
||||
|
||||
val l = arguments[0].toArgumentInfo(context)
|
||||
val r = arguments[1].toArgumentInfo(context)
|
||||
val l = arguments[0].unwrapToMoreUsefulExpression().toArgumentInfo(context)
|
||||
val r = arguments[1].unwrapToMoreUsefulExpression().toArgumentInfo(context)
|
||||
|
||||
checkSenselessness(l.smartCastType, r.smartCastType, context, expression, reporter)
|
||||
|
||||
@@ -81,6 +78,11 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirExpression.unwrapToMoreUsefulExpression() = when (this) {
|
||||
is FirWhenSubjectExpression -> whenRef.value.subject ?: this
|
||||
else -> this
|
||||
}
|
||||
|
||||
private fun checkEqualityApplicability(l: TypeInfo, r: TypeInfo, context: CheckerContext): Applicability {
|
||||
val oneIsBuiltin = l.isBuiltin || r.isBuiltin
|
||||
val oneIsIdentityLess = l.isIdentityLess || r.isIdentityLess
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ fun foo(a: Any) {
|
||||
}
|
||||
|
||||
when (a) {
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR, EQUALITY_NOT_APPLICABLE_WARNING, INCOMPATIBLE_TYPES!>a == 1<!> -> print("1")
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR, EQUALITY_NOT_APPLICABLE_WARNING, INCOMPATIBLE_TYPES_WARNING!>a == 1<!> -> print("1")
|
||||
}
|
||||
|
||||
if (<!EQUALITY_NOT_APPLICABLE!>(a <!USELESS_CAST!>as A<!>) == (<!EQUALITY_NOT_APPLICABLE_WARNING!>a == 1<!>)<!>) {
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ fun incompatibleTypes(a: Int) = when(a) {
|
||||
fun incompatibleTypesSmartCast(a: Any?) {
|
||||
if (a is Int) {
|
||||
when(a) {
|
||||
<!INCOMPATIBLE_TYPES!>C(10)<!> -> 1
|
||||
<!INCOMPATIBLE_TYPES_WARNING!>C(10)<!> -> 1
|
||||
else -> 2
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user