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);