correct import priority for files under virtualenv lib root (PY-8231)

This commit is contained in:
Dmitry Jemerov
2012-12-12 20:10:43 +01:00
parent 911365bebc
commit eb22c802a3
2 changed files with 36 additions and 5 deletions
@@ -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) {
@@ -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);