diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 0c75fffe7ee9..690634088078 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableSet; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.*; @@ -14,6 +15,7 @@ import com.jetbrains.python.codeInsight.PyDynamicMember; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFile; +import com.jetbrains.python.psi.PyImportElement; import com.jetbrains.python.psi.resolve.PyResolveContext; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.resolve.VariantsProcessor; @@ -111,7 +113,12 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } if (point == ResolveImportUtil.PointInImport.NONE || point == ResolveImportUtil.PointInImport.AS_NAME) { // when not imported from, add regular attributes - final VariantsProcessor processor = new VariantsProcessor(location); + final VariantsProcessor processor = new VariantsProcessor(location, new Condition() { + @Override + public boolean value(PsiElement psiElement) { + return !(psiElement instanceof PyImportElement); + } + }, null); processor.setPlainNamesOnly(point == ResolveImportUtil.PointInImport.AS_NAME); // no parens after imported function names myModule.processDeclarations(processor, ResolveState.initial(), null, location); if (names_already != null) { diff --git a/python/testData/completion/reexportModules/a.after.py b/python/testData/completion/reexportModules/a.after.py new file mode 100644 index 000000000000..3198490efaf0 --- /dev/null +++ b/python/testData/completion/reexportModules/a.after.py @@ -0,0 +1,3 @@ +import b + +b.da \ No newline at end of file diff --git a/python/testData/completion/reexportModules/a.py b/python/testData/completion/reexportModules/a.py new file mode 100644 index 000000000000..3198490efaf0 --- /dev/null +++ b/python/testData/completion/reexportModules/a.py @@ -0,0 +1,3 @@ +import b + +b.da \ No newline at end of file diff --git a/python/testData/completion/reexportModules/b.py b/python/testData/completion/reexportModules/b.py new file mode 100644 index 000000000000..576825f9264d --- /dev/null +++ b/python/testData/completion/reexportModules/b.py @@ -0,0 +1 @@ +import datetime diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index d37cfdf9fff6..2b26c0f8f833 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -21,6 +21,13 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { 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"); + } + public void testLocalVar() { doTest(); } @@ -295,17 +302,11 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { } public void testDuplicateImportKeyword() { // PY-3034 - myFixture.copyDirectoryToProject("completion/duplicateImportKeyword", ""); - myFixture.configureByFile("a.py"); - myFixture.completeBasic(); - myFixture.checkResultByFile("completion/duplicateImportKeyword/a.after.py"); + doMultiFileTest(); } public void testImportInMiddleOfHierarchy() { // PY-3016 - myFixture.copyDirectoryToProject("completion/importInMiddleOfHierarchy", ""); - myFixture.configureByFile("a.py"); - myFixture.completeBasic(); - myFixture.checkResultByFile("completion/importInMiddleOfHierarchy/a.after.py"); + doMultiFileTest(); } public void testLambdaInExpression() { // PY-3150 @@ -315,4 +316,8 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { public void testVeryPrivate() { // PY-3246 doTest(); } + + public void testReexportModules() { // PY-2385 + doMultiFileTest(); + } }