From 017bf71da625d4112e75516a75341db29e90d989 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 6 Nov 2014 15:37:58 +0300 Subject: [PATCH] Fixed completion for 'import ' (PY-7375) --- .../com/jetbrains/python/psi/types/PyModuleType.java | 8 +++++--- .../completion/importNamespacePackage/a.after.py | 1 + .../testData/completion/importNamespacePackage/a.py | 1 + .../com/jetbrains/python/Py3CompletionTest.java | 12 ++++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 python/testData/completion/importNamespacePackage/a.after.py create mode 100644 python/testData/completion/importNamespacePackage/a.py diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 0aec8612c989..8db0b716194f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -245,7 +245,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje * not suitable for import. */ @NotNull - private static List getSubmodulesList(final PsiDirectory directory) { + private static List getSubmodulesList(final PsiDirectory directory, @Nullable PsiElement anchor) { List result = new ArrayList(); if (directory != null) { // just in case @@ -259,7 +259,9 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } // dir modules for (PsiDirectory dir : directory.getSubdirectories()) { - if (dir.findFile(PyNames.INIT_DOT_PY) instanceof PyFile) result.add(dir); + if (PyUtil.isPackage(dir, anchor)) { + result.add(dir); + } } } return result; @@ -365,7 +367,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje PsiElement location, Set namesAlready) { List result = new ArrayList(); - for (PsiFileSystemItem item : getSubmodulesList(directory)) { + for (PsiFileSystemItem item : getSubmodulesList(directory, location)) { if (item != location.getContainingFile().getOriginalFile()) { LookupElement lookupElement = buildFileLookupElement(item, namesAlready); if (lookupElement != null) { diff --git a/python/testData/completion/importNamespacePackage/a.after.py b/python/testData/completion/importNamespacePackage/a.after.py new file mode 100644 index 000000000000..3a900b8dcab9 --- /dev/null +++ b/python/testData/completion/importNamespacePackage/a.after.py @@ -0,0 +1 @@ +import nspkg1 diff --git a/python/testData/completion/importNamespacePackage/a.py b/python/testData/completion/importNamespacePackage/a.py new file mode 100644 index 000000000000..bbb3f11374c9 --- /dev/null +++ b/python/testData/completion/importNamespacePackage/a.py @@ -0,0 +1 @@ +import nspk diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index ca7c3c2649f3..a950cf6584c5 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -69,6 +69,13 @@ public class Py3CompletionTest extends PyTestCase { myFixture.checkResultByFile(testName + ".after.py"); } + private void doMultiFileTest() { + myFixture.copyDirectoryToProject("completion/" + getTestName(true), ""); + myFixture.configureByFile("a.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile("completion/" + getTestName(true) + "/a.after.py"); + } + private List doTestByText(String text) { myFixture.configureByText(PythonFileType.INSTANCE, text); myFixture.completeBasic(); @@ -93,4 +100,9 @@ public class Py3CompletionTest extends PyTestCase { setLanguageLevel(null); } } + + // PY-7375 + public void testImportNamespacePackage() { + doMultiFileTest(); + } }