From 108b42b84bc85bc630944ad7b5279b30bc6e39d2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 5 Feb 2013 19:52:23 +0100 Subject: [PATCH] when completing members of imported module, look at local imports, not only file-level ones (PY-3668) --- .../jetbrains/python/psi/types/PyImportedModuleType.java | 6 +++++- .../src/com/jetbrains/python/psi/types/PyModuleType.java | 2 +- python/testData/completion/py3668/foo/__init__.py | 0 python/testData/completion/py3668/foo/bar.py | 0 python/testData/completion/py3668/py3668.after.py | 3 +++ python/testData/completion/py3668/py3668.py | 3 +++ .../testSrc/com/jetbrains/python/PythonCompletionTest.java | 7 +++++++ 7 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 python/testData/completion/py3668/foo/__init__.py create mode 100644 python/testData/completion/py3668/foo/bar.py create mode 100644 python/testData/completion/py3668/py3668.after.py create mode 100644 python/testData/completion/py3668/py3668.py diff --git a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java index 9a06a4f61263..29b50a8f7c71 100644 --- a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java @@ -4,7 +4,9 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ProcessingContext; +import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFile; @@ -51,7 +53,9 @@ public class PyImportedModuleType implements PyType { public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { List result = new ArrayList(); - final List importTargets = myImportedModule.getContainingFile().getImportTargets(); + ScopeOwner scopeOwner = PsiTreeUtil.getParentOfType(location, ScopeOwner.class); + assert scopeOwner != null; + final List importTargets = PyModuleType.getVisibleImports(scopeOwner); final int imported = myImportedModule.getImportedPrefix().getComponentCount(); for (PyImportElement importTarget : importTargets) { final PyQualifiedName qName = importTarget.getImportedQName(); diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index e4e1754fdce5..70d0d9f23219 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -167,7 +167,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } @NotNull - private static List getVisibleImports(@NotNull ScopeOwner owner) { + public static List getVisibleImports(@NotNull ScopeOwner owner) { final List visibleImports = new ArrayList(); PyResolveUtil.scopeCrawlUp(new PsiScopeProcessor() { @Override diff --git a/python/testData/completion/py3668/foo/__init__.py b/python/testData/completion/py3668/foo/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/py3668/foo/bar.py b/python/testData/completion/py3668/foo/bar.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/py3668/py3668.after.py b/python/testData/completion/py3668/py3668.after.py new file mode 100644 index 000000000000..352310d2ca45 --- /dev/null +++ b/python/testData/completion/py3668/py3668.after.py @@ -0,0 +1,3 @@ +def func(): + import foo.bar + foo.bar diff --git a/python/testData/completion/py3668/py3668.py b/python/testData/completion/py3668/py3668.py new file mode 100644 index 000000000000..f3f5379fc8c9 --- /dev/null +++ b/python/testData/completion/py3668/py3668.py @@ -0,0 +1,3 @@ +def func(): + import foo.bar + foo. diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 044c6208fc44..2cf060e79998 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -613,4 +613,11 @@ public class PythonCompletionTest extends PyTestCase { doTestByText("def foo(**)"); myFixture.checkResult("def foo(**kwargs)"); } + + public void testLocalImportedModule() { // PY-3668 + myFixture.copyDirectoryToProject("completion/py3668", ""); + myFixture.configureByFile("py3668.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile("completion/py3668/py3668.after.py"); + } }