diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
index 05dc987be1ef..451a1db5b390 100644
--- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
@@ -637,7 +637,19 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference
// include our own names
final int underscores = PyUtil.getInitialUnderscores(element.getName());
- final CompletionVariantsProcessor processor = new CompletionVariantsProcessor(element);
+ final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(element);
+ final CompletionVariantsProcessor processor = new CompletionVariantsProcessor(element, e -> {
+ if (builtinCache.isBuiltin(e)) {
+ final String name = e instanceof PyElement ? ((PyElement)e).getName() : null;
+ if (e instanceof PyImportElement) {
+ return false;
+ }
+ if (name != null && PyUtil.getInitialUnderscores(name) == 1) {
+ return false;
+ }
+ }
+ return true;
+ }, null);
final ScopeOwner owner = realContext instanceof ScopeOwner ? (ScopeOwner)realContext : ScopeUtil.getScopeOwner(realContext);
if (owner != null) {
PyResolveUtil.scopeCrawlUp(processor, owner, null, null);
@@ -648,7 +660,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference
KeywordArgumentCompletionUtil.collectFunctionArgNames(element, ret, TypeEvalContext.codeCompletion(element.getProject(), element.getContainingFile()));
// include builtin names
- final PyFile builtinsFile = PyBuiltinCache.getInstance(element).getBuiltinsFile();
+ final PyFile builtinsFile = builtinCache.getBuiltinsFile();
if (builtinsFile != null) {
PyResolveUtil.scopeCrawlUp(processor, builtinsFile, null, null);
}
diff --git a/python/src/com/jetbrains/python/psi/resolve/PythonBuiltinReferenceResolveProvider.java b/python/src/com/jetbrains/python/psi/resolve/PythonBuiltinReferenceResolveProvider.java
index 1dab95b9fd11..b1dcd9b58840 100644
--- a/python/src/com/jetbrains/python/psi/resolve/PythonBuiltinReferenceResolveProvider.java
+++ b/python/src/com/jetbrains/python/psi/resolve/PythonBuiltinReferenceResolveProvider.java
@@ -59,7 +59,7 @@ public class PythonBuiltinReferenceResolveProvider implements PyReferenceResolve
// ...as a builtin symbol
final PyFile builtinsFile = builtinCache.getBuiltinsFile();
- if (builtinsFile != null && !PyUtil.isClassPrivateName(referencedName)) {
+ if (builtinsFile != null && !PyUtil.isClassPrivateName(referencedName) && PyUtil.getInitialUnderscores(referencedName) != 1) {
for (RatedResolveResult resolveResult : builtinsFile.multiResolveName(referencedName)) {
result.add(new ImportedResolveResult(resolveResult.getElement(), resolveResult.getRate(), null));
}
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/noProtectedBuiltinNames.py b/python/testData/inspections/PyUnresolvedReferencesInspection/noProtectedBuiltinNames.py
new file mode 100644
index 000000000000..bab889cd914e
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/noProtectedBuiltinNames.py
@@ -0,0 +1,3 @@
+print(_T, _KT)
+print(__import__)
+print(len)
diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
index 6e66e1a7d0d8..70a901b1cd16 100644
--- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
@@ -1114,6 +1114,22 @@ public class PythonCompletionTest extends PyTestCase {
assertSameElements(variants, "mod1", "mod2", "foo", "_bar");
}
+ // PY-22828
+ public void testNoImportedBuiltinNames() {
+ final List suggested = doTestByText("T\n");
+ assertNotNull(suggested);
+ assertContainsElements(suggested, "TypeError");
+ assertDoesntContain(suggested, "TypeVar");
+ }
+
+ // PY-22828
+ public void testNoProtectedBuiltinNames() {
+ final List suggested = doTestByText("_\n");
+ assertNotNull(suggested);
+ assertContainsElements(suggested, "__import__");
+ assertDoesntContain(suggested, "_T", "_KT");
+ }
+
@Override
protected String getTestDataPath() {
return super.getTestDataPath() + "/completion";
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
index 0b4da8a34b8e..e26d550b25ed 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
@@ -763,6 +763,11 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
doTest();
}
+ // PY-22828
+ public void testNoProtectedBuiltinNames() {
+ doTest();
+ }
+
@NotNull
@Override
protected Class extends PyInspection> getInspectionClass() {