Don't consider imported element as private if it is presented in dunder all (PY-46169)

GitOrigin-RevId: b9f22ea3c7619f9db5b06e321ed3fe46cbaaea60
This commit is contained in:
Semyon Proshev
2020-12-31 14:04:04 +00:00
committed by intellij-monorepo-bot
parent 9db384e71d
commit 09c1f70856
3 changed files with 13 additions and 5 deletions
@@ -46,8 +46,9 @@ class PyiFile(viewProvider: FileViewProvider) : PyFileImpl(viewProvider, PyiLang
if (exported && isPrivateName(name) && !resolvingBuiltinPathLike(name)) return emptyList()
val baseResults = super.multiResolveName(name, exported)
val dunderAll = dunderAll ?: emptyList()
return if (exported)
baseResults.filterNot { isPrivateImport((it as? ImportedResolveResult)?.definer) }
baseResults.filterNot { isPrivateImport((it as? ImportedResolveResult)?.definer, dunderAll) }
else
baseResults
}
@@ -56,9 +57,10 @@ class PyiFile(viewProvider: FileViewProvider) : PyFileImpl(viewProvider, PyiLang
resolveState: ResolveState,
lastParent: PsiElement?,
place: PsiElement): Boolean {
val dunderAll = dunderAll ?: emptyList()
val wrapper = object : DelegatingScopeProcessor(processor) {
override fun execute(element: PsiElement, state: ResolveState): Boolean = when {
isPrivateImport(element) -> true
isPrivateImport(element, dunderAll) -> true
element is PsiNamedElement && isPrivateName(element.name) -> true
else -> super.execute(element, state)
}
@@ -68,7 +70,9 @@ class PyiFile(viewProvider: FileViewProvider) : PyFileImpl(viewProvider, PyiLang
private fun isPrivateName(name: String?) = PyUtil.getInitialUnderscores(name) == 1
private fun isPrivateImport(element: PsiElement?) = element is PyImportElement && element.asName == null
private fun isPrivateImport(element: PsiElement?, dunderAll: List<String>): Boolean {
return element is PyImportElement && element.asName == null && element.visibleName !in dunderAll
}
private fun resolvingBuiltinPathLike(name: String): Boolean {
return name == PyNames.BUILTIN_PATH_LIKE && PyBuiltinCache.getInstance(this).builtinsFile == this
@@ -1,7 +1,8 @@
from m1 import <error descr="Cannot find reference 'foo' in 'm1.pyi'">foo</error>
from m1 import <error descr="Cannot find reference 'bar' in 'm1.pyi'">bar</error>
from m1 import bar_imported
from m1 import baz
from m1 import <error descr="Cannot find reference 'm2' in 'm1.pyi'">m2</error>
from m1 import m2_imported
print(foo, bar, bar_imported, m2, m2_imported)
print(foo, bar, bar_imported, baz, m2, m2_imported)
@@ -1,4 +1,7 @@
from m2 import foo
from m2 import bar as bar_imported
from m2 import baz
import m2
import m2 as m2_imported
import m2 as m2_imported
__all__ = ["baz"]