diff --git a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java index eb2b9f7c6e9c..b3b7a65ede87 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java @@ -17,9 +17,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.tree.TokenSet; @@ -106,10 +104,7 @@ public class PyFromImportStatementImpl extends PyElementImpl implements PyFromIm PyReferenceExpression expr = getImportSource(); if (expr != null) { final PsiElement importedFile = ResolveImportUtil.resolveImportReference(expr); - if (importedFile instanceof PsiDirectory) { - PsiFile file = ((PsiDirectory)importedFile).findFile(PyNames.INIT_DOT_PY); - if (file != null) return file.processDeclarations(processor, state, null, place); - } else if (importedFile != null) { + if (importedFile != null) { return importedFile.processDeclarations(processor, state, null, place); } } diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index 7c1d261da721..29b54b36ac36 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -173,6 +173,10 @@ public class ResolveImportUtil { if (imported_from_module == null) imported_from_module = resolveModuleInRoots(module_reference, source_file); } } + if (imported_from_module instanceof PsiDirectory) { + PsiFile file = ((PsiDirectory)imported_from_module).findFile(PyNames.INIT_DOT_PY); + if (file != null) imported_from_module = file; + } return imported_from_module; } finally { diff --git a/python/testData/completion/moduleClass.after.py b/python/testData/completion/moduleClass.after.py new file mode 100644 index 000000000000..93bec39862f7 --- /dev/null +++ b/python/testData/completion/moduleClass.after.py @@ -0,0 +1,3 @@ +from completion import mymodule + +a = mymodule.Foo \ No newline at end of file diff --git a/python/testData/completion/moduleClass.py b/python/testData/completion/moduleClass.py new file mode 100644 index 000000000000..cd2c93cb9e66 --- /dev/null +++ b/python/testData/completion/moduleClass.py @@ -0,0 +1,3 @@ +from completion import mymodule + +a = mymodule.F \ No newline at end of file diff --git a/python/testData/completion/mymodule/__init__.py b/python/testData/completion/mymodule/__init__.py new file mode 100644 index 000000000000..b7bc218672e1 --- /dev/null +++ b/python/testData/completion/mymodule/__init__.py @@ -0,0 +1 @@ +from completion.mymodule.mysubmodule import * \ No newline at end of file diff --git a/python/testData/completion/mymodule/mysubmodule/__init__.py b/python/testData/completion/mymodule/mysubmodule/__init__.py new file mode 100644 index 000000000000..5c67126f0df8 --- /dev/null +++ b/python/testData/completion/mymodule/mysubmodule/__init__.py @@ -0,0 +1,2 @@ +class Foo: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 179416f18101..f435804a05ab 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -42,4 +42,14 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { public void testPredefinedMethodNot() throws Exception { doTest(); } + + public void testPy255() throws Exception { + final String dirname = "completion/"; + final String testName = dirname + "moduleClass"; + myFixture.configureByFile(testName + ".py"); + myFixture.copyDirectoryToProject(dirname + "mymodule", dirname + "mymodule"); + myFixture.copyDirectoryToProject(dirname + "mymodule/mysubmodule", dirname + "mymodule/mysubmodule"); + myFixture.completeBasic(); + myFixture.checkResultByFile(testName + ".after.py"); + } } \ No newline at end of file