From f71abda0e2fdd517c5f8f6f915a6c2893d3d3fc9 Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Thu, 24 Dec 2015 16:12:41 +0300 Subject: [PATCH] PY-14234 Fix false positive when underscored module imported inside the package --- .../inspections/PyProtectedMemberInspection.java | 13 ++++++++++++- .../importFromTheSamePackage/my_package/__init__.py | 0 .../my_package/_package_internal_module.py | 2 ++ .../my_package/my_public_module.py | 3 +++ .../PyProtectedMemberInspectionTest.java | 9 +++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/__init__.py create mode 100644 python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/_package_internal_module.py create mode 100644 python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/my_public_module.py diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java index 8ad9527b6784..8d13596eb622 100644 --- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java @@ -21,6 +21,7 @@ import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiReference; @@ -85,8 +86,18 @@ public class PyProtectedMemberInspection extends PyInspection { if (!(statement instanceof PyFromImportStatement)) return; final PyReferenceExpression importReferenceExpression = node.getImportReferenceExpression(); final PyReferenceExpression importSource = ((PyFromImportStatement)statement).getImportSource(); - if (importReferenceExpression != null && importSource != null) + if (importReferenceExpression != null && importSource != null && !isImportFromTheSamePackage(importSource)) { checkReference(importReferenceExpression, importSource); + } + } + + private boolean isImportFromTheSamePackage(PyReferenceExpression importSource) { + PsiDirectory directory = importSource.getContainingFile().getContainingDirectory(); + if (PyUtil.isPackage(directory, true, importSource.getContainingFile()) && + directory.getName().equals(importSource.getName())) { + return true; + } + return false; } @Override diff --git a/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/__init__.py b/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/_package_internal_module.py b/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/_package_internal_module.py new file mode 100644 index 000000000000..27ee855c4efb --- /dev/null +++ b/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/_package_internal_module.py @@ -0,0 +1,2 @@ +def very_smart_func(param): + return None \ No newline at end of file diff --git a/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/my_public_module.py b/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/my_public_module.py new file mode 100644 index 000000000000..c29039630586 --- /dev/null +++ b/python/testData/inspections/PyProtectedMemberInspection/importFromTheSamePackage/my_package/my_public_module.py @@ -0,0 +1,3 @@ +from my_package import _package_internal_module # False positive here + +_package_internal_module.very_smart_func("spam") \ 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 51c81c2474db..a273f83e182a 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyProtectedMemberInspectionTest.java @@ -69,6 +69,15 @@ public class PyProtectedMemberInspectionTest extends PyTestCase { myFixture.checkHighlighting(false, false, true); } + //PY-14234 + public void testImportFromTheSamePackage() { + String path = getTestName(true); + myFixture.copyDirectoryToProject(path + "/my_package", "./my_package"); + myFixture.configureByFile("/my_package/my_public_module.py"); + myFixture.enableInspections(PyProtectedMemberInspection.class); + myFixture.checkHighlighting(false, false, true); + } + public void testModule() { myFixture.configureByFiles(getTestName(true) + ".py", "tmp.py"); myFixture.enableInspections(PyProtectedMemberInspection.class);