From 9ef3a2b3a4162440324134e3cbe6190cf1e55b15 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Fri, 7 Apr 2017 20:33:46 +0300 Subject: [PATCH] Don't show non-public names from buitlins stub in completion (PY-22828) The Typeshed stub from buitlins contains several non-public names: * Imports from other modules * Protected names (_foo) --- .../psi/impl/references/PyReferenceImpl.java | 16 ++++++++++++++-- .../PythonBuiltinReferenceResolveProvider.java | 2 +- .../noProtectedBuiltinNames.py | 3 +++ .../jetbrains/python/PythonCompletionTest.java | 16 ++++++++++++++++ .../PyUnresolvedReferencesInspectionTest.java | 5 +++++ 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection/noProtectedBuiltinNames.py 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 getInspectionClass() {