[FIR] Reuse `shouldReportAsPerRules1()` in `FirCastOperatorsChecker`
This change better aligns the checker with
the description in KT-57779.
^KT-57779
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirTypeCompatibilityHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirTypeCompatibilityHelpers.kt
index 66e48ad..af3433f 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirTypeCompatibilityHelpers.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirTypeCompatibilityHelpers.kt
@@ -128,3 +128,15 @@
}
internal fun areRelated(a: TypeInfo, b: TypeInfo, context: CheckerContext): Boolean = !areUnrelated(a, b, context)
+
+/**
+ * See [KT-57779](https://youtrack.jetbrains.com/issue/KT-57779) for more information.
+ */
+internal fun shouldReportAsPerRules1(l: TypeInfo, r: TypeInfo, context: CheckerContext): Boolean {
+ val oneIsFinal = l.isFinal || r.isFinal
+
+ return when {
+ oneIsFinal -> areUnrelated(l, r, context)
+ else -> false
+ }
+}
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCastOperatorsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCastOperatorsChecker.kt
index bf8b10c..569a3e1 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCastOperatorsChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCastOperatorsChecker.kt
@@ -53,7 +53,7 @@
|| l.type.isNullableNothing && !r.type.isNullable
return when {
- l.type.isNothing && r.type.isNothingOrNullableNothing -> Applicability.APPLICABLE
+ l.type.isNothing -> Applicability.APPLICABLE
r.type.isNothing -> Applicability.IMPOSSIBLE_CAST
isNullableNothingWithNotNull -> when (expression.operation) {
// (null as? WhatEver) == null
@@ -71,12 +71,11 @@
useless: Applicability,
context: CheckerContext,
): Applicability {
- val oneIsFinal = l.isFinal || r.isFinal
val oneIsNotNull = !l.type.isNullable || !r.type.isNullable
return when {
isRefinementUseless(context, l.directType.upperBoundIfFlexible(), r.directType, expression) -> useless
- oneIsNotNull && oneIsFinal && areUnrelated(l, r, context) -> impossible
+ oneIsNotNull && shouldReportAsPerRules1(l, r, context) -> impossible
isCastErased(l.directType, r.directType, context) -> Applicability.CAST_ERASED
else -> Applicability.APPLICABLE
}
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt
index a649370..edb05a3 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt
@@ -105,16 +105,6 @@
}
}
- private fun shouldReportAsPerRules1(l: TypeInfo, r: TypeInfo, context: CheckerContext): Boolean {
- val oneIsFinal = l.isFinal || r.isFinal
-
- return when {
- l.type.isNothingOrNullableNothing || r.type.isNothingOrNullableNothing -> false
- oneIsFinal -> areUnrelated(l, r, context)
- else -> false
- }
- }
-
/**
* K1 reports different diagnostics for different
* cases, and this enum helps to replicate the K1's