From 5fa7c78ebe2e89a9d77543134a42d8b057fe4611 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Sat, 19 Nov 2016 19:16:14 +0300 Subject: [PATCH] PY-20427 Handle qualified references in the module where symbol is moved to --- .../moduleMembers/PyMoveSymbolProcessor.java | 17 +++++++++++------ .../after/src/a.py | 1 + .../after/src/b.py | 12 ++++++++++++ .../before/src/a.py | 3 +++ .../before/src/b.py | 9 +++++++++ .../python/refactoring/PyMoveTest.java | 5 +++++ 6 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/a.py create mode 100644 python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/b.py create mode 100644 python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/a.py create mode 100644 python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/b.py diff --git a/python/src/com/jetbrains/python/refactoring/move/moduleMembers/PyMoveSymbolProcessor.java b/python/src/com/jetbrains/python/refactoring/move/moduleMembers/PyMoveSymbolProcessor.java index 7ab7f3b9c6f4..4e122ef77c0d 100644 --- a/python/src/com/jetbrains/python/refactoring/move/moduleMembers/PyMoveSymbolProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/move/moduleMembers/PyMoveSymbolProcessor.java @@ -192,13 +192,18 @@ public class PyMoveSymbolProcessor { */ private static void insertQualifiedImportAndReplaceReference(@NotNull PsiNamedElement targetElement, @NotNull PyQualifiedExpression expression) { - final PsiFile file = targetElement.getContainingFile(); - final QualifiedName qualifier = QualifiedNameFinder.findCanonicalImportPath(file, expression); - PyClassRefactoringUtil.insertImport(expression, file, null, false); final PyElementGenerator generator = PyElementGenerator.getInstance(expression.getProject()); - final PyExpression generated = generator.createExpressionFromText(LanguageLevel.forElement(expression), - qualifier + "." + expression.getReferencedName()); - expression.replace(generated); + final PsiFile srcFile = targetElement.getContainingFile(); + final LanguageLevel languageLevel = LanguageLevel.forElement(expression); + if (srcFile != expression.getContainingFile()) { + final QualifiedName qualifier = QualifiedNameFinder.findCanonicalImportPath(srcFile, expression); + PyClassRefactoringUtil.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())); + } } private static boolean resolvesToLocalStarImport(@NotNull PsiElement usage) { diff --git a/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/a.py b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/a.py new file mode 100644 index 000000000000..b3964fd08eaf --- /dev/null +++ b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/a.py @@ -0,0 +1 @@ +something_else = 2 diff --git a/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/b.py b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/b.py new file mode 100644 index 000000000000..a61715de6e8b --- /dev/null +++ b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/after/src/b.py @@ -0,0 +1,12 @@ +import a + + +def bar(): + print(FOO) + + +def some_other_fn(): + print(a.something_else) + + +FOO = 1 \ No newline at end of file diff --git a/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/a.py b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/a.py new file mode 100644 index 000000000000..a56af0a69c57 --- /dev/null +++ b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/a.py @@ -0,0 +1,3 @@ +FOO = 1 + +something_else = 2 diff --git a/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/b.py b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/b.py new file mode 100644 index 000000000000..a73fadf6740d --- /dev/null +++ b/python/testData/refactoring/move/qualifiedReferenceInDestinationModule/before/src/b.py @@ -0,0 +1,9 @@ +import a + + +def bar(): + print(a.FOO) + + +def some_other_fn(): + print(a.something_else) diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java index f4997f0a84ce..48c86bc59f0a 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java @@ -371,6 +371,11 @@ public class PyMoveTest extends PyTestCase { doMoveSymbolTest("A", "b.py"); } + // PY-20427 + public void testQualifiedReferenceInDestinationModule() { + doMoveSymbolTest("FOO", "b.py"); + } + private void doMoveFileTest(String fileName, String toDirName) { Project project = myFixture.getProject(); PsiManager manager = PsiManager.getInstance(project);