fixed PY-12544 Access to a protected member: false negative for import statements

This commit is contained in:
Ekaterina Tuzova
2014-04-09 18:12:28 +04:00
parent 5baf0cd4f8
commit 8da69d7cb2
3 changed files with 20 additions and 5 deletions
@@ -32,10 +32,7 @@ import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType;
import com.jetbrains.python.inspections.quickfix.PyAddPropertyForFieldQuickFix;
import com.jetbrains.python.inspections.quickfix.PyMakePublicQuickFix;
import com.jetbrains.python.inspections.quickfix.PyRenameElementQuickFix;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.types.PyModuleType;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.refactoring.PyRefactoringUtil;
@@ -80,10 +77,21 @@ public class PyProtectedMemberInspection extends PyInspection {
super(holder, session);
}
@Override
public void visitPyImportElement(PyImportElement node) {
final PyStatement statement = node.getContainingImportStatement();
if (!(statement instanceof PyFromImportStatement)) return;
checkReference(node.getImportReferenceExpression(), ((PyFromImportStatement)statement).getImportSource());
}
@Override
public void visitPyReferenceExpression(PyReferenceExpression node) {
final PyExpression qualifier = node.getQualifier();
if (qualifier == null || PyNames.CANONICAL_SELF.equals(qualifier.getText())) return;
checkReference(node, qualifier);
}
private void checkReference(PyReferenceExpression node, PyExpression qualifier) {
if (myTypeEvalContext.getType(qualifier) instanceof PyNamedTupleType) return;
final String name = node.getName();
final List<LocalQuickFix> quickFixes = new ArrayList<LocalQuickFix>();
@@ -111,7 +119,7 @@ public class PyProtectedMemberInspection extends PyInspection {
final PyClass parentClass = getClassOwner(node);
if (parentClass != null) {
if (PyTestUtil.isPyTestClass(parentClass) && ignoreTestFunctions) return;
if (parentClass.isSubclass(resolvedClass))
return;
@@ -0,0 +1 @@
from tmp import <weak_warning descr="Access to a protected member _CONSTANT of a class">_CONSTANT</weak_warning>
@@ -15,11 +15,13 @@
*/
package com.jetbrains.python.inspections;
import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.fixtures.PyTestCase;
/**
* User: ktisha
*/
@TestDataPath("$CONTENT_ROOT/../testData/inspections/PyProtectedMemberInspection")
public class PyProtectedMemberInspectionTest extends PyTestCase {
public void testTruePositive() {
@@ -54,6 +56,10 @@ public class PyProtectedMemberInspectionTest extends PyTestCase {
doTest();
}
public void testFromImport() {
doTest();
}
public void testModule() {
myFixture.configureByFiles(getTestName(true) + ".py", "tmp.py");
myFixture.enableInspections(PyProtectedMemberInspection.class);