From 59a909ff25754d5b3ba7f67d4efebf7b0ae5a1cb Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Wed, 14 Jun 2017 16:06:19 +0300 Subject: [PATCH] PY-24445 Fixed: False positive: PyCharm ignores issubclass check inside list comprehension Update PyControlFlowBuilder to use PyTypeAssertionEvaluator while visiting if-components inside comprehensions. --- .../controlflow/PyControlFlowBuilder.java | 3 +++ .../testSrc/com/jetbrains/python/Py3TypeTest.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java b/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java index bf0f8a3ae1c5..da1716e952a1 100644 --- a/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java +++ b/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java @@ -730,7 +730,10 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor { else { myBuilder.startNode(condition); } + final PyTypeAssertionEvaluator assertionEvaluator = new PyTypeAssertionEvaluator(); condition.accept(this); + condition.accept(assertionEvaluator); + InstructionBuilder.addAssertInstructions(myBuilder, assertionEvaluator); // Condition is true for nested "for" and "if" constructs, next startNode() should create a conditional node prevCondition = condition; diff --git a/python/testSrc/com/jetbrains/python/Py3TypeTest.java b/python/testSrc/com/jetbrains/python/Py3TypeTest.java index cd6a54282c47..20d6ad6db0fa 100644 --- a/python/testSrc/com/jetbrains/python/Py3TypeTest.java +++ b/python/testSrc/com/jetbrains/python/Py3TypeTest.java @@ -595,6 +595,19 @@ public class Py3TypeTest extends PyTestCase { ); } + // PY-24445 + public void testIsSubclassInsideListComprehension() { + doTest("List[Type[A]]", + "class A: pass\n" + + "expr = [e for e in [] if issubclass(e, A)]"); + } + + public void testIsInstanceInsideListComprehension() { + doTest("List[A]", + "class A: pass\n" + + "expr = [e for e in [] if isinstance(e, A)]"); + } + private void doTest(final String expectedType, final String text) { myFixture.configureByText(PythonFileType.INSTANCE, text); final PyExpression expr = myFixture.findElementByText("expr", PyExpression.class);