From 4ba52eb062fe8cd060d39db50b07a03057387844 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Mon, 2 Jul 2018 19:55:38 +0300 Subject: [PATCH] Fix doing type assertions for ` is ` statements, `None` should be presented on one side only (PY-29748) --- .../controlflow/PyTypeAssertionEvaluator.java | 22 +++++++++---------- .../com/jetbrains/python/PyTypeTest.java | 8 +++++++ 2 files changed, 18 insertions(+), 12 deletions(-) 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());