From 8da69d7cb2d7f083d1eed8201dab5c5703576962 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 9 Apr 2014 18:12:28 +0400 Subject: [PATCH] fixed PY-12544 Access to a protected member: false negative for import statements --- .../PyProtectedMemberInspection.java | 18 +++++++++++++----- .../PyProtectedMemberInspection/fromImport.py | 1 + .../PyProtectedMemberInspectionTest.java | 6 ++++++ 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 python/testData/inspections/PyProtectedMemberInspection/fromImport.py diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java index ddb14f1a34a9..e766bc00a7bf 100644 --- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java @@ -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 quickFixes = new ArrayList(); @@ -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; diff --git a/python/testData/inspections/PyProtectedMemberInspection/fromImport.py b/python/testData/inspections/PyProtectedMemberInspection/fromImport.py new file mode 100644 index 000000000000..6767289526a7 --- /dev/null +++ b/python/testData/inspections/PyProtectedMemberInspection/fromImport.py @@ -0,0 +1 @@ +from tmp import _CONSTANT \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java index 3c5969f27c1e..60221fc49b20 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java @@ -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);