From 4adbd237582a03e6bbad61031fd28e5be7ff4c8f Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 15 Aug 2025 17:20:04 +0300 Subject: [PATCH] PY-63319 Simplify the check, add a clarifying comment GitOrigin-RevId: cd845db87ab2c9c9f9218ce7c7d2ae28bc2a7613 --- .../python/codeInsight/ConditionUtil.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/ConditionUtil.kt b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/ConditionUtil.kt index f2c5a2e0cad7..414bf11fecd6 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/ConditionUtil.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/ConditionUtil.kt @@ -207,11 +207,22 @@ private fun getInvertedConditionExpression( val chainedExpressions = mutableListOf() var currentExpression = expression while (currentExpression is PyBinaryExpression && comparisonStrings.containsKey(currentExpression.operator)) { - val leftExpression = (currentExpression.leftExpression as? PyBinaryExpression)?.takeIf { comparisonStrings.containsKey(it.operator) }?.rightExpression - ?: currentExpression.leftExpression + val leftExpression = currentExpression.leftExpression + // The left operand forms a chained comparison, e.g. + // `left.left <= left.right < right`, which is equivalent to + // `(left.left <= left.right) and (left.right < right)` + // so it should be inverted as + // `not (left.left <= left.right) or not (left.right < right)` or, after simplification, + // `left.left > left.right or left.right >= right` + val newLeftExpression = if (leftExpression is PyBinaryExpression && comparisonStrings.containsKey(leftExpression.operator)) { + leftExpression.rightExpression ?: leftExpression + } + else { + leftExpression + } val invertedOperator = invertedComparisons.getValue(currentExpression.operator) val invertedExpression = generator.createBinaryExpression( - comparisonStrings.getValue(invertedOperator), leftExpression, currentExpression.rightExpression!!) + comparisonStrings.getValue(invertedOperator), newLeftExpression, currentExpression.rightExpression!!) chainedExpressions.add(invertedExpression) currentExpression = currentExpression.leftExpression }