diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index ff9393a084eb..597905adf603 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -133,9 +133,15 @@ public class ResolveImportUtil { if (moduleQName != null) { // either "from bar import foo" or "from ...bar import foo" final List candidates = resolveModule(moduleQName, file, absolute_import_enabled, relative_level); + List resultList = new ArrayList(); for (PsiElement candidate : candidates) { PsiElement result = resolveChild(PyUtil.turnDirIntoInit(candidate), first_component, file, null, false, true); - if (result != null) return Collections.singletonList(result); + if (result != null) { + resultList.add(result); + } + } + if (!resultList.isEmpty()) { + return resultList; } } } diff --git a/python/testData/MockSdkWithBinaryModules/Lib/PySide/QtGui.so b/python/testData/MockSdkWithBinaryModules/Lib/PySide/QtGui.so new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/MockSdkWithBinaryModules/Lib/PySide/__init__.py b/python/testData/MockSdkWithBinaryModules/Lib/PySide/__init__.py new file mode 100644 index 000000000000..d9db08ea3175 --- /dev/null +++ b/python/testData/MockSdkWithBinaryModules/Lib/PySide/__init__.py @@ -0,0 +1 @@ +__all__ = ['QtCore', 'QtGui', 'QtNetwork', 'QtOpenGL', 'QtSql', 'QtSvg', 'QtTest', 'QtWebKit', 'QtScript'] diff --git a/python/testData/MockSdkWithBinaryModules/bin/python2.5 b/python/testData/MockSdkWithBinaryModules/bin/python2.5 new file mode 100644 index 000000000000..586f986fd3af --- /dev/null +++ b/python/testData/MockSdkWithBinaryModules/bin/python2.5 @@ -0,0 +1 @@ +# placeholder for python interpreter diff --git a/python/testData/MockSdkWithBinaryModules/python_stubs/PySide/QtGui.py b/python/testData/MockSdkWithBinaryModules/python_stubs/PySide/QtGui.py new file mode 100644 index 000000000000..316792184861 --- /dev/null +++ b/python/testData/MockSdkWithBinaryModules/python_stubs/PySide/QtGui.py @@ -0,0 +1,2 @@ +class QPen(object): + pass diff --git a/python/testData/MockSdkWithBinaryModules/python_stubs/PySide/__init__.py b/python/testData/MockSdkWithBinaryModules/python_stubs/PySide/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/pySideImport.after.py b/python/testData/completion/pySideImport.after.py new file mode 100644 index 000000000000..9d79a9eb07f6 --- /dev/null +++ b/python/testData/completion/pySideImport.after.py @@ -0,0 +1,3 @@ +from PySide import QtGui + +QtGui.QPen \ No newline at end of file diff --git a/python/testData/completion/pySideImport.py b/python/testData/completion/pySideImport.py new file mode 100644 index 000000000000..d5483ea3c242 --- /dev/null +++ b/python/testData/completion/pySideImport.py @@ -0,0 +1,3 @@ +from PySide import QtGui + +QtGui.QP \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyBinaryModuleCompletionTest.java b/python/testSrc/com/jetbrains/python/PyBinaryModuleCompletionTest.java new file mode 100644 index 000000000000..f1b2a91ef366 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/PyBinaryModuleCompletionTest.java @@ -0,0 +1,22 @@ +package com.jetbrains.python; + +import com.intellij.testFramework.LightProjectDescriptor; +import com.jetbrains.python.fixtures.PyLightFixtureTestCase; + +/** + * @author yole + */ +public class PyBinaryModuleCompletionTest extends PyLightFixtureTestCase { + public void testPySideImport() { // PY-2443 + myFixture.configureByFile("completion/pySideImport.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile("completion/pySideImport.after.py"); + } + + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return ourDescriptor; + } + + private static PyLightProjectDescriptor ourDescriptor = new PyLightProjectDescriptor("WithBinaryModules"); +} diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index 22131e972171..1774d5a92925 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -71,7 +71,8 @@ public class PythonAllTestsSuite { EpydocStringTest.class, PyEmacsTabTest.class, PyTypeParserTest.class, - PyOverrideTest.class + PyOverrideTest.class, + PyBinaryModuleCompletionTest.class }; public static TestSuite suite() { diff --git a/python/testSrc/com/jetbrains/python/PythonMockSdk.java b/python/testSrc/com/jetbrains/python/PythonMockSdk.java index 792c85209273..438d73ac4947 100644 --- a/python/testSrc/com/jetbrains/python/PythonMockSdk.java +++ b/python/testSrc/com/jetbrains/python/PythonMockSdk.java @@ -5,6 +5,7 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl; +import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.vfs.LocalFileSystem; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NonNls; @@ -18,6 +19,9 @@ import java.util.List; public class PythonMockSdk { @NonNls private static final String MOCK_SDK_NAME = "Mock Python SDK"; + private PythonMockSdk() { + } + public static Sdk findOrCreate(String version) { final List sdkList = ProjectJdkTable.getInstance().getSdksOfType(PythonSdkType.getInstance()); for (Sdk sdk : sdkList) { @@ -43,8 +47,15 @@ public class PythonMockSdk { }; final SdkModificator sdkModificator = sdk.getSdkModificator(); sdkModificator.setHomePath(sdkHome); + + File libPath = new File(mock_path, "Lib"); + if (libPath.exists()) { + sdkModificator.addRoot(LocalFileSystem.getInstance().refreshAndFindFileByIoFile(libPath), OrderRootType.CLASSES); + } + String mock_stubs_path = mock_path + PythonSdkType.SKELETON_DIR_NAME; sdkModificator.addRoot(LocalFileSystem.getInstance().refreshAndFindFileByPath(mock_stubs_path), PythonSdkType.BUILTIN_ROOT_TYPE); + //PythonSdkType.setupSdkPaths(sdkModificator, null); sdkModificator.commitChanges(); return sdk;