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

GitOrigin-RevId: 00c7867db4fa463c6a2eabb32bfa181bb25311d6
This commit is contained in:
chbndrhnns
2025-11-22 10:59:41 +00:00
committed by intellij-monorepo-bot
parent 5eb2c5d8fc
commit e3576b58e5
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");