From d36f47ddd7e27a57cb99ba59e1fb98dbaadbb2f0 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Tue, 3 May 2016 16:16:41 +0300 Subject: [PATCH] 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. --- .../codeInsight/imports/AddImportHelper.java | 4 +- .../libraryRootInsideProject/a.py | 0 .../libraryRootInsideProject/lib/b.py | 0 .../libraryRootInsideProject/main.after.py | 5 +++ .../libraryRootInsideProject/main.py | 4 ++ .../python/PyOptimizeImportsTest.java | 38 +++++++++++++++++++ 6 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 python/testData/optimizeImports/libraryRootInsideProject/a.py create mode 100644 python/testData/optimizeImports/libraryRootInsideProject/lib/b.py create mode 100644 python/testData/optimizeImports/libraryRootInsideProject/main.after.py create mode 100644 python/testData/optimizeImports/libraryRootInsideProject/main.py diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java index 1f5bbbe3511d..8534a2c900aa 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java @@ -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); diff --git a/python/testData/optimizeImports/libraryRootInsideProject/a.py b/python/testData/optimizeImports/libraryRootInsideProject/a.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/optimizeImports/libraryRootInsideProject/lib/b.py b/python/testData/optimizeImports/libraryRootInsideProject/lib/b.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/optimizeImports/libraryRootInsideProject/main.after.py b/python/testData/optimizeImports/libraryRootInsideProject/main.after.py new file mode 100644 index 000000000000..f69993a00d48 --- /dev/null +++ b/python/testData/optimizeImports/libraryRootInsideProject/main.after.py @@ -0,0 +1,5 @@ +import b + +import a + +print(a, b) diff --git a/python/testData/optimizeImports/libraryRootInsideProject/main.py b/python/testData/optimizeImports/libraryRootInsideProject/main.py new file mode 100644 index 000000000000..8a707f2b825d --- /dev/null +++ b/python/testData/optimizeImports/libraryRootInsideProject/main.py @@ -0,0 +1,4 @@ +import a +import b + +print(a, b) diff --git a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java index 668b53d84186..c812c354c016 100644 --- a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java +++ b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java @@ -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()));