mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fixed PY-12544 Access to a protected member: false negative for import statements
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user