diff --git a/python/src/com/jetbrains/python/codeInsight/controlflow/PyTypeAssertionEvaluator.java b/python/src/com/jetbrains/python/codeInsight/controlflow/PyTypeAssertionEvaluator.java index 52a720c10925..e7869e9c5416 100644 --- a/python/src/com/jetbrains/python/codeInsight/controlflow/PyTypeAssertionEvaluator.java +++ b/python/src/com/jetbrains/python/codeInsight/controlflow/PyTypeAssertionEvaluator.java @@ -103,20 +103,18 @@ public class PyTypeAssertionEvaluator extends PyRecursiveElementVisitor { final boolean leftIsNone = lhs instanceof PyNoneLiteralExpression || PyNames.NONE.equals(lhs.getName()); final boolean rightIsNone = rhs instanceof PyNoneLiteralExpression || PyNames.NONE.equals(rhs.getName()); - if (leftIsNone && rightIsNone) { - return; - } + if (leftIsNone ^ rightIsNone) { + final PyReferenceExpression target = (PyReferenceExpression)(rightIsNone ? lhs : rhs); - final PyReferenceExpression target = (PyReferenceExpression)(rightIsNone ? lhs : rhs); + if (node.isOperator(PyNames.IS)) { + pushAssertion(target, myPositive, false, context -> PyNoneType.INSTANCE); + return; + } - if (node.isOperator(PyNames.IS)) { - pushAssertion(target, myPositive, false, context -> PyNoneType.INSTANCE); - return; - } - - if (node.isOperator("isnot")) { - pushAssertion(target, !myPositive, false, context -> PyNoneType.INSTANCE); - return; + if (node.isOperator("isnot")) { + pushAssertion(target, !myPositive, false, context -> PyNoneType.INSTANCE); + return; + } } } diff --git a/python/testSrc/com/jetbrains/python/PyTypeTest.java b/python/testSrc/com/jetbrains/python/PyTypeTest.java index 17500d3eafea..f5de040c43c5 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeTest.java @@ -3244,6 +3244,14 @@ public class PyTypeTest extends PyTestCase { "expr = T"); } + // PY-29748 + public void testAfterIdentityComparison() { + doTest("int", + "a = 1\n" + + "if a is a:\n" + + " expr = a"); + } + private static List getTypeEvalContexts(@NotNull PyExpression element) { return ImmutableList.of(TypeEvalContext.codeAnalysis(element.getProject(), element.getContainingFile()).withTracing(), TypeEvalContext.userInitiated(element.getProject(), element.getContainingFile()).withTracing());