PY-76629: Suppress PyProtectedMemberInspection if a member is defined in .pyi

Protected member should not be highlighted as a warning if it resolves to .pyi file.
We assume that everything in .pyi file is a public API.

GitOrigin-RevId: 60b01e5df9979f6e58e60056aceb74bef9db72dc
This commit is contained in:
Ilia Zakoulov
2024-10-16 17:17:22 +00:00
committed by intellij-monorepo-bot
parent bb96ca528e
commit e8f761c33b
5 changed files with 21 additions and 0 deletions
@@ -20,6 +20,7 @@ import com.jetbrains.python.inspections.PyInspectionExtension
import com.jetbrains.python.psi.PyFromImportStatement
import com.jetbrains.python.psi.PyImportElement
import com.jetbrains.python.psi.PyImportStatement
import com.jetbrains.python.psi.PyReferenceExpression
import com.jetbrains.python.psi.types.TypeEvalContext
class PyiInspectionExtension : PyInspectionExtension() {
@@ -35,4 +36,9 @@ class PyiInspectionExtension : PyInspectionExtension() {
}
return elements.isEmpty() || elements.any { it.asName != null }
}
override fun ignoreProtectedSymbol(expression: PyReferenceExpression, context: TypeEvalContext): Boolean {
val referencedElement = expression.reference.resolve()
return referencedElement?.containingFile is PyiFile
}
}
@@ -0,0 +1,4 @@
from test import MyClass
public_api = MyClass._public_api
not_public_api = <weak_warning descr="Access to a protected member _not_public_api of a class">MyClass._not_public_api</weak_warning>
@@ -0,0 +1,4 @@
class MyClass:
def __init__(self):
self._public_api = "abacaba"
self._not_public_api = "qwerty"
@@ -0,0 +1,3 @@
class MyClass:
def __init__(self) -> None: ...
_public_api: str
@@ -16,6 +16,7 @@
package com.jetbrains.python.pyi;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.idea.TestFor;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.PsiDocumentManager;
@@ -149,4 +150,7 @@ public class PyiInspectionsTest extends PyTestCase {
public void testMissedSuperInitCall() {
doPyiTest(PyMissingConstructorInspection.class);
}
@TestFor(issues = "PY-16477")
public void testAccessProtectedProperty() { doPyTest(PyProtectedMemberInspection.class); }
}