diff --git a/python/src/com/jetbrains/python/psi/search/PyProjectScopeBuilder.java b/python/src/com/jetbrains/python/psi/search/PyProjectScopeBuilder.java index 87c048064306..201b383a206b 100644 --- a/python/src/com/jetbrains/python/psi/search/PyProjectScopeBuilder.java +++ b/python/src/com/jetbrains/python/psi/search/PyProjectScopeBuilder.java @@ -8,12 +8,14 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.FileIndexFacade; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.search.*; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.Nullable; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -135,6 +137,27 @@ public class PyProjectScopeBuilder extends ProjectScopeBuilderImpl { return findLibDir(sdk.getRootProvider().getFiles(OrderRootType.CLASSES)); } + public static VirtualFile findVirtualEnvLibDir(Sdk sdk) { + VirtualFile[] classVFiles = sdk.getRootProvider().getFiles(OrderRootType.CLASSES); + String homePath = sdk.getHomePath(); + if (homePath != null) { + File root = PythonSdkType.getVirtualEnvRoot(homePath); + if (root != null) { + File libRoot = new File(root, "lib"); + File[] versionRoots = libRoot.listFiles(); + if (versionRoots != null && versionRoots.length == 1) { + libRoot = versionRoots[0]; + } + for (VirtualFile file : classVFiles) { + if (FileUtil.pathsEqual(file.getPath(), libRoot.getPath())) { + return file; + } + } + } + } + return null; + } + @Nullable private static VirtualFile findLibDir(VirtualFile[] files) { for (VirtualFile file : files) { diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index e2bce13df9b0..820be312c640 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -774,11 +774,11 @@ public class PythonSdkType extends SdkType { if (pythonSdk != null) { final VirtualFile libDir = PyProjectScopeBuilder.findLibDir(pythonSdk); if (libDir != null && VfsUtilCore.isAncestor(libDir, vFile, false)) { - final VirtualFile sitePackages = libDir.findChild(PyNames.SITE_PACKAGES); - if (sitePackages != null && VfsUtilCore.isAncestor(sitePackages, vFile, false)) { - return false; - } - return true; + return isNotSitePackages(vFile, libDir); + } + final VirtualFile venvLibDir = PyProjectScopeBuilder.findVirtualEnvLibDir(pythonSdk); + if (venvLibDir != null && VfsUtilCore.isAncestor(venvLibDir, vFile, false)) { + return isNotSitePackages(vFile, venvLibDir); } final VirtualFile skeletonsDir = findSkeletonsDir(pythonSdk); if (skeletonsDir != null && @@ -789,6 +789,14 @@ public class PythonSdkType extends SdkType { return false; } + private static boolean isNotSitePackages(VirtualFile vFile, VirtualFile libDir) { + final VirtualFile sitePackages = libDir.findChild(PyNames.SITE_PACKAGES); + if (sitePackages != null && VfsUtilCore.isAncestor(sitePackages, vFile, false)) { + return false; + } + return true; + } + @Nullable public static Sdk findPython2Sdk(@Nullable Module module) { Sdk moduleSDK = findPythonSdk(module);