don't include declarations under if __name__ == "__main__" in stubs (PY-4008)

This commit is contained in:
Dmitry Jemerov
2011-06-28 21:26:19 +02:00
parent b16acc5c05
commit 8c042c0a22
7 changed files with 47 additions and 14 deletions
@@ -60,6 +60,8 @@ public class PyNames {
public static final String DEPRECATION_WARNING = "DeprecationWarning";
public static final String PENDING_DEPRECATION_WARNING = "PendingDeprecationWarning";
public static final String NAME = "__name__";
/**
* Contains all known predefined names of "__foo__" form.
*/
@@ -43,7 +43,7 @@ public class PyFileElementType extends IStubFileElementType<PyFileStub> {
@Override
public int getStubVersion() {
return 34;
return 35;
}
@Override
@@ -506,6 +506,28 @@ public class PyUtil {
return null;
}
public static boolean isIfNameEqualsMain(PyIfStatement ifStatement) {
final PyExpression condition = ifStatement.getIfPart().getCondition();
return isNameEqualsMain(condition);
}
private static boolean isNameEqualsMain(PyExpression condition) {
if (condition instanceof PyParenthesizedExpression) {
return isNameEqualsMain(((PyParenthesizedExpression) condition).getContainedExpression());
}
if (condition instanceof PyBinaryExpression) {
PyBinaryExpression binaryExpression = (PyBinaryExpression)condition;
if (binaryExpression.getOperator() == PyTokenTypes.OR_KEYWORD) {
return isNameEqualsMain(binaryExpression.getLeftExpression()) || isNameEqualsMain(binaryExpression.getRightExpression());
}
final PyExpression rhs = binaryExpression.getRightExpression();
return binaryExpression.getOperator() == PyTokenTypes.EQEQ &&
binaryExpression.getLeftExpression().getText().equals(PyNames.NAME) &&
rhs != null && rhs.getText().contains("__main__");
}
return false;
}
public static class KnownDecoratorProviderHolder {
public static PyKnownDecoratorProvider[] KNOWN_DECORATOR_PROVIDERS = Extensions.getExtensions(PyKnownDecoratorProvider.EP_NAME);
@@ -1,9 +1,12 @@
package com.jetbrains.python.psi.impl.stubs;
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;
/**
* @author yole
@@ -17,4 +20,12 @@ public class PyFileStubBuilder extends DefaultStubBuilder {
return super.createStubForFile(file);
}
@Override
protected boolean skipChildProcessingWhenBuildingStubs(PsiElement element, PsiElement child) {
if (element instanceof PyIfStatement) {
return PyUtil.isIfNameEqualsMain((PyIfStatement)element);
}
return false;
}
}
@@ -5,11 +5,7 @@ import com.intellij.openapi.module.Module;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.psi.PyBinaryExpression;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyIfStatement;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.run.RunnableScriptFilter;
import org.jetbrains.annotations.NotNull;
@@ -32,14 +28,7 @@ public class PythonUnitTestRunnableScriptFilter implements RunnableScriptFilter
}
if (element instanceof PyIfStatement) {
PyIfStatement ifStatement = (PyIfStatement)element;
final PyExpression condition = ifStatement.getIfPart().getCondition();
if (condition instanceof PyBinaryExpression) {
PyBinaryExpression binaryExpression = (PyBinaryExpression)condition;
final PyExpression rhs = binaryExpression.getRightExpression();
return binaryExpression.getOperator() == PyTokenTypes.EQEQ &&
binaryExpression.getLeftExpression().getText().equals("__name__") &&
rhs != null && rhs.getText().contains("__main__");
}
return PyUtil.isIfNameEqualsMain(ifStatement);
}
return false;
}
+2
View File
@@ -0,0 +1,2 @@
if __name__ == '__main__':
xyzzy = None
@@ -315,6 +315,13 @@ public class PyStubsTest extends PyLightFixtureTestCase {
assertNotParsed(file);
}
public void testIfNameMain() { // PY-4008
getTestFile();
GlobalSearchScope scope = GlobalSearchScope.allScope(myFixture.getProject());
Collection<PyTargetExpression> result = PyVariableNameIndex.find("xyzzy", myFixture.getProject(), scope);
assertEquals(0, result.size());
}
// ---
private PyFile getTestFile() {