diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/PyFileElementType.java b/python/python-psi-impl/src/com/jetbrains/python/psi/PyFileElementType.java index 9803f639bc8e..c06ec56de0cf 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/PyFileElementType.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/PyFileElementType.java @@ -60,7 +60,7 @@ public class PyFileElementType extends IStubFileElementType { @Override public int getStubVersion() { // Don't forget to update versions of indexes that use the updated stub-based elements - return 104; + return 105; } @Override diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyFileStubBuilder.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyFileStubBuilder.java index 4a4061093b38..5198d763e4ec 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyFileStubBuilder.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyFileStubBuilder.java @@ -20,9 +20,9 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.stubs.DefaultStubBuilder; import com.intellij.psi.stubs.StubElement; -import com.jetbrains.python.psi.PyFile; -import com.jetbrains.python.psi.PyIfStatement; -import com.jetbrains.python.psi.PyUtil; +import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.impl.PyEvaluator; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; @@ -38,7 +38,36 @@ public class PyFileStubBuilder extends DefaultStubBuilder { @Override public boolean skipChildProcessingWhenBuildingStubs(@NotNull ASTNode parent, @NotNull ASTNode node) { - PsiElement psi = parent.getPsi(); - return psi instanceof PyIfStatement && PyUtil.isIfNameEqualsMain((PyIfStatement)psi); + PsiElement parentPsi = parent.getPsi(); + if (parentPsi instanceof PyIfStatement && PyUtil.isIfNameEqualsMain((PyIfStatement)parentPsi)) { + return true; + } + if (parentPsi instanceof PyIfStatement ifStatement && node.getPsi() instanceof PyStatementPart part) { + return isAlwaysUnreachable(ifStatement, part); + } + return false; + } + + private static boolean isAlwaysUnreachable(@NotNull PyIfStatement ifStatement, @NotNull PyStatementPart part) { + assert part.getParent() == ifStatement; + + for (PyIfPart ifPart : StreamEx.of(ifStatement.getIfPart()).append(ifStatement.getElifParts())) { + if (ifPart == part) { + break; + } + Boolean result = PyEvaluator.evaluateAsBooleanNoResolve(ifPart.getCondition()); + if (result == Boolean.TRUE) { + return true; + } + } + + if (part instanceof PyIfPart ifPart) { + Boolean result = PyEvaluator.evaluateAsBooleanNoResolve(ifPart.getCondition()); + if (result == Boolean.FALSE) { + return true; + } + } + + return false; } } diff --git a/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingOptional/lib.py b/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingOptional/lib.py index 1a591276b252..6453697c594e 100644 --- a/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingOptional/lib.py +++ b/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingOptional/lib.py @@ -1,4 +1,4 @@ -if True: +if input(): foo = 42 else: foo = None diff --git a/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingUnion/lib.py b/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingUnion/lib.py index a2f833e7dea3..fdd1795c6f3a 100644 --- a/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingUnion/lib.py +++ b/python/testData/intentions/PyAnnotateVariableTypeIntentionTest/AnnotationImportTypingUnion/lib.py @@ -1,4 +1,4 @@ -if True: +if input(): foo = 42 else: foo = 'spam' diff --git a/python/testSrc/com/jetbrains/python/Py3TypeTest.java b/python/testSrc/com/jetbrains/python/Py3TypeTest.java index 9ab1fab7a9cc..bd5f0acff700 100644 --- a/python/testSrc/com/jetbrains/python/Py3TypeTest.java +++ b/python/testSrc/com/jetbrains/python/Py3TypeTest.java @@ -3348,6 +3348,23 @@ public class Py3TypeTest extends PyTestCase { """); } + // PY-50642 + public void testTypeCheckingMultiFile() { + myFixture.addFileToProject("mod.py", """ + import typing + + if not not typing.TYPE_CHECKING: + v: int = -1 + else: + v: str = 'ab' + """); + + doTest("int", """ + from mod import v + expr = v + """); + } + // PY-73958 public void testNoStackOverflow() { doTest("Foo", """