diff --git a/python/python-psi-impl/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/python-psi-impl/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java index f502225a0af7..0b1630a85694 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java +++ b/python/python-psi-impl/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java @@ -25,11 +25,13 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyPsiBundle; +import com.jetbrains.python.codeInsight.PyCodeInsightSettings; import com.jetbrains.python.codeInsight.imports.AddImportHelper; import com.jetbrains.python.codeInsight.imports.PyImportOptimizer; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyImportedModule; import com.jetbrains.python.psi.impl.PyPsiUtils; +import com.jetbrains.python.psi.resolve.QualifiedNameFinder; import com.jetbrains.python.refactoring.PyPsiRefactoringUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -273,7 +275,27 @@ public final class PyClassRefactoringUtil { if (PsiTreeUtil.isAncestor(targetNode.getContainingFile(), target, false)) return; if (ArrayUtil.contains(target, otherMovedElements)) return; if (target instanceof PyFile || target instanceof PsiDirectory) { - PyPsiRefactoringUtil.insertImport(targetNode, target, asName, useFromImport != null ? useFromImport : true); + boolean preferFromImport = useFromImport != null ? useFromImport : true; + boolean isUsedAsQualifier = sourceNode.getParent() instanceof PyQualifiedExpression && + ((PyQualifiedExpression)sourceNode.getParent()).getQualifier() == sourceNode; + boolean shouldQualifyReference = target instanceof PyFile && + PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT && + useFromImport != null && useFromImport && + asName == null && + !isUsedAsQualifier; + if (shouldQualifyReference) { + preferFromImport = false; + } + PyPsiRefactoringUtil.insertImport(targetNode, target, asName, preferFromImport); + if (shouldQualifyReference) { + QualifiedName canonicalPath = QualifiedNameFinder.findCanonicalImportPath(target, targetNode); + if (canonicalPath != null && sourceNode.isValid()) { + String qualifiedReference = canonicalPath.toString(); + PyElementGenerator generator = PyElementGenerator.getInstance(sourceNode.getProject()); + PyExpression newExpr = generator.createExpressionFromText(LanguageLevel.forElement(sourceNode), qualifiedReference); + sourceNode.replace(newExpr); + } + } } else { PyPsiRefactoringUtil.insertImport(targetNode, target, asName, true); diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/__init__.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/dst.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/dst.py new file mode 100644 index 000000000000..c6f302fd077c --- /dev/null +++ b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/dst.py @@ -0,0 +1,5 @@ +import lib.mod + + +def usage(): + lib.mod diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/mod.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/mod.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/src.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/src.py new file mode 100644 index 000000000000..139597f9cb07 --- /dev/null +++ b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/after/src/lib/src.py @@ -0,0 +1,2 @@ + + diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/__init__.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/dst.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/dst.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/mod.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/mod.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/src.py b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/src.py new file mode 100644 index 000000000000..4ebfa84010aa --- /dev/null +++ b/python/testData/refactoring/move/importForMovedElementWithPreferredQualifiedImportStyleModule/before/src/lib/src.py @@ -0,0 +1,4 @@ +from lib import mod + +def usage(): + mod \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java index da52b86564bc..bc8ec38f7546 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java @@ -283,6 +283,18 @@ public class PyMoveTest extends PyTestCase { } } + @TestFor(issues="PY-6591") + public void testImportForMovedElementWithPreferredQualifiedImportStyleModule() { + final boolean defaultImportStyle = PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT; + try { + PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT = true; + doMoveSymbolTest("usage", "lib/dst.py"); + } + finally { + PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT = defaultImportStyle; + } + } + @TestFor(issues="PY-84659") public void testQualifiedUsageRespectsPreferFromImport() { final boolean defaultImportStyle = PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT;