ignore ifs in comprehensions when determine if the file is runnable

This commit is contained in:
aleksei.kniazev
2019-01-23 14:27:51 +03:00
committed by Aleksei Kniazev
parent 0e39b09476
commit 9034bb6261
3 changed files with 17 additions and 7 deletions

View File

@@ -21,13 +21,14 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyIfStatement;
import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.psi.impl.PyIfStatementNavigator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -46,11 +47,10 @@ public class PyRunLineMarkerContributor extends RunLineMarkerContributor {
private static boolean isMainClauseOnTopLevel(@NotNull PsiElement element) {
if (element.getNode().getElementType() == PyTokenTypes.IF_KEYWORD) {
element = PsiTreeUtil.getParentOfType(element, PyIfStatement.class);
return element != null &&
element.getParent() instanceof PsiFile &&
PyUtil.isIfNameEqualsMain(((PyIfStatement)element));
PyIfStatement statement = PyIfStatementNavigator.getIfStatementByIfKeyword(element);
return statement != null &&
ScopeUtil.getScopeOwner(element) instanceof PyFile &&
PyUtil.isIfNameEqualsMain(statement);
}
else {
return false;

View File

@@ -0,0 +1,5 @@
if __name__ == "__main__":
result = [i for i in range(10) if i != 0]
result = [i for i in range(10) if i != 0]

View File

@@ -32,6 +32,11 @@ public class PyRunLineMarkerTest extends PyTestCase {
assertTrue(elementWithInfo.getParent().getText().startsWith("if"));
}
public void testWithManyIfs() {
List<LineMarkerInfo> infos = getInfos("runnable_with_ifs.py");
assertEquals("There should be only one marker", 1, infos.size());
}
public void testNotRunnable() {
assertEquals(0, getInfos("not_runnable.py").size());
}