fixed PY-11293 namedtuple underscore-methods are not protected

This commit is contained in:
Ekaterina Tuzova
2014-03-06 19:20:27 +04:00
parent 4d87683c00
commit 06b2ee381e
3 changed files with 12 additions and 0 deletions
@@ -25,6 +25,7 @@ import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyReferenceExpression;
@@ -72,6 +73,7 @@ public class PyProtectedMemberInspection extends PyInspection {
public void visitPyReferenceExpression(PyReferenceExpression node) {
final PyExpression qualifier = node.getQualifier();
if (qualifier == null || PyNames.CANONICAL_SELF.equals(qualifier.getText())) return;
if (myTypeEvalContext.getType(qualifier) instanceof PyNamedTupleType) return;
final String name = node.getName();
if (name != null && name.startsWith("_") && !name.startsWith("__") && !name.endsWith("__")) {
final PyClass parentClass = getClassOwner(node);
@@ -0,0 +1,6 @@
from collections import namedtuple
i = namedtuple('Point', ['x', 'y'], verbose=True)
i._replace( **{"a":"a"})
@@ -50,6 +50,10 @@ public class PyProtectedMemberInspectionTest extends PyTestCase {
doTest();
}
public void testNamedTuple() {
doTest();
}
public void testModule() {
myFixture.configureByFiles(getTestName(true) + ".py", "tmp.py");
myFixture.enableInspections(PyProtectedMemberInspection.class);