From ee160862113a217266b5a5269be747f6996793fb Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 23 Mar 2018 15:45:22 +0300 Subject: [PATCH] PY-29121 Handle a missing case of the common name placement in Simplify chained comparison When it's on the right of a leftmost comparison and there's an additional AND term between the two comparisons to be chained. --- .../PyChainedComparisonsInspection.java | 17 +++++++++++++---- .../testData/inspections/ChainedComparison9.py | 1 + .../inspections/ChainedComparison9_after.py | 1 + .../com/jetbrains/python/PyQuickFixTest.java | 5 +++++ 4 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 python/testData/inspections/ChainedComparison9.py create mode 100644 python/testData/inspections/ChainedComparison9_after.py diff --git a/python/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java b/python/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java index 634d91c6bec5..fe051edba49c 100644 --- a/python/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java @@ -121,11 +121,20 @@ public class PyChainedComparisonsInspection extends PyInspection { private boolean isRightSimplified(@NotNull final PyBinaryExpression leftExpression, @NotNull final PyBinaryExpression rightExpression) { + final PyExpression leftLeft = leftExpression.getLeftExpression(); final PyExpression leftRight = leftExpression.getRightExpression(); - if (leftRight instanceof PyBinaryExpression && PyTokenTypes.AND_KEYWORD == leftExpression.getOperator()) { - if (isRightSimplified((PyBinaryExpression)leftRight, rightExpression)) { - getInnerRight = true; - return true; + if (PyTokenTypes.AND_KEYWORD == leftExpression.getOperator()) { + if (leftRight instanceof PyBinaryExpression) { + if (isRightSimplified((PyBinaryExpression)leftRight, rightExpression)) { + getInnerRight = true; + return true; + } + } + if (leftLeft instanceof PyBinaryExpression && + PyTokenTypes.RELATIONAL_OPERATIONS.contains(((PyBinaryExpression)leftLeft).getOperator())) { + if (isRightSimplified(((PyBinaryExpression)leftLeft), rightExpression)) { + return true; + } } } diff --git a/python/testData/inspections/ChainedComparison9.py b/python/testData/inspections/ChainedComparison9.py new file mode 100644 index 000000000000..b9dfa664cb71 --- /dev/null +++ b/python/testData/inspections/ChainedComparison9.py @@ -0,0 +1 @@ +0 < x and True and x < 2 \ No newline at end of file diff --git a/python/testData/inspections/ChainedComparison9_after.py b/python/testData/inspections/ChainedComparison9_after.py new file mode 100644 index 000000000000..c105dbc420a2 --- /dev/null +++ b/python/testData/inspections/ChainedComparison9_after.py @@ -0,0 +1 @@ +0 < x < 2 and True \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index de6b66bcbd50..6ca11277d7ec 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -306,6 +306,11 @@ public class PyQuickFixTest extends PyTestCase { doInspectionTest(PyChainedComparisonsInspection.class, "Simplify chained comparison", true, true); } + // PY-29121 + public void testChainedComparison9() { + doInspectionTest(PyChainedComparisonsInspection.class, "Simplify chained comparison", true, true); + } + // PY-1362, PY-2585 public void testStatementEffect() { doInspectionTest(PyStatementEffectInspection.class, PyBundle.message("QFIX.statement.effect"), true, true);