[PY-84659] Moving a symbol respects PyCodeInsightSettings.PREFER_FROM_IMPORT for qualified usages

(cherry picked from commit 00c7867db4fa463c6a2eabb32bfa181bb25311d6)

GitOrigin-RevId: 83c0b47a97bbbd8f74279766eecefc05b3381784
This commit is contained in:
chbndrhnns
2025-11-24 04:18:16 +00:00
committed by intellij-monorepo-bot
parent 00e64bd481
commit 861247150d
9 changed files with 36 additions and 3 deletions
@@ -11,6 +11,7 @@ import com.intellij.psi.util.QualifiedName;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.PyDunderAllReference;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
@@ -214,9 +215,17 @@ public class PyMoveSymbolProcessor {
final LanguageLevel languageLevel = LanguageLevel.forElement(expression);
if (srcFile != expression.getContainingFile()) {
final QualifiedName qualifier = QualifiedNameFinder.findCanonicalImportPath(srcFile, expression);
PyPsiRefactoringUtil.insertImport(expression, srcFile, null, false);
final String newQualifiedReference = qualifier + "." + expression.getReferencedName();
expression.replace(generator.createExpressionFromText(languageLevel, newQualifiedReference));
if (PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT) {
PyPsiRefactoringUtil.insertImport(expression, srcFile, null, true);
final String moduleName = qualifier.getLastComponent();
final String newQualifiedReference = moduleName + "." + expression.getReferencedName();
expression.replace(generator.createExpressionFromText(languageLevel, newQualifiedReference));
}
else {
PyPsiRefactoringUtil.insertImport(expression, srcFile, null, false);
final String newQualifiedReference = qualifier + "." + expression.getReferencedName();
expression.replace(generator.createExpressionFromText(languageLevel, newQualifiedReference));
}
}
else {
expression.replace(generator.createExpressionFromText(languageLevel, expression.getReferencedName()));
@@ -0,0 +1,3 @@
from lib import src, dst
assert dst.C
@@ -0,0 +1,3 @@
from lib import src
assert src.C
@@ -3,6 +3,7 @@ package com.jetbrains.python.refactoring;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.idea.TestFor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
@@ -282,6 +283,18 @@ public class PyMoveTest extends PyTestCase {
}
}
@TestFor(issues="PY-84659")
public void testQualifiedUsageRespectsPreferFromImport() {
final boolean defaultImportStyle = PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT;
try {
PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT = true;
doMoveSymbolTest("C", "lib/dst.py");
}
finally {
PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT = defaultImportStyle;
}
}
// PY-10553
public void testMoveModuleWithSameNameAsSymbolInside() {
doMoveFileTest("Animals/Carnivore.py", "Animals/test");