PY-18970 Check that imports in "project" group don't belong to any library root

Consider such imports as imports from the standard library or third party
libraries instead.
This commit is contained in:
Mikhail Golubev
2016-05-04 14:12:10 +03:00
parent ade5d0605f
commit d36f47ddd7
6 changed files with 50 additions and 1 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -263,7 +264,8 @@ public class AddImportHelper {
return UNRESOLVED_SYMBOL_PRIORITY;
}
final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(toImport.getProject());
if (projectRootManager.getFileIndex().isInContent(vFile)) {
final ProjectFileIndex fileIndex = projectRootManager.getFileIndex();
if (fileIndex.isInContent(vFile) && !fileIndex.isInLibraryClasses(vFile)) {
return ImportPriority.PROJECT;
}
final Module module = ModuleUtilCore.findModuleForPsiElement(importLocation);
@@ -0,0 +1,5 @@
import b
import a
print(a, b)
@@ -0,0 +1,4 @@
import a
import b
print(a, b)
@@ -17,7 +17,13 @@ package com.jetbrains.python;
import com.intellij.codeInsight.actions.OptimizeImportsAction;
import com.intellij.ide.DataManager;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.sdk.PythonSdkType;
/**
* @author yole
@@ -95,6 +101,38 @@ public class PyOptimizeImportsTest extends PyTestCase {
doTest();
}
// PY-18970
public void testLibraryRootInsideProject() {
final String testName = getTestName(true);
myFixture.copyDirectoryToProject(testName, "");
final VirtualFile libDir = myFixture.findFileInTempDir("lib");
assertNotNull(libDir);
final Sdk sdk = PythonSdkType.findPythonSdk(myFixture.getModule());
assertNotNull(sdk);
WriteAction.run(() -> {
final SdkModificator modificator = sdk.getSdkModificator();
assertNotNull(modificator);
modificator.addRoot(libDir, OrderRootType.CLASSES);
modificator.commitChanges();
});
try {
myFixture.configureByFile("main.py");
OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));
myFixture.checkResultByFile(testName + "/main.after.py");
}
finally {
//noinspection ThrowFromFinallyBlock
WriteAction.run(() -> {
final SdkModificator modificator = sdk.getSdkModificator();
assertNotNull(modificator);
modificator.removeRoot(libDir, OrderRootType.CLASSES);
modificator.commitChanges();
});
}
}
private void doTest() {
myFixture.configureByFile(getTestName(true) + ".py");
OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));