From 2d1525e5663416586fc834d7a2cb5fd3fbcc7960 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 13 Apr 2017 14:00:49 +0200 Subject: [PATCH] move classes and packages: retarget usages before decode to provide correct qualified names (IDEA-170920) --- .../MoveClassesOrPackagesProcessor.java | 4 ++-- .../packageAndReferencedClass/after/b/B.java | 6 ++++++ .../packageAndReferencedClass/after/b/C.java | 2 ++ .../packageAndReferencedClass/after/b/a/A.java | 2 ++ .../packageAndReferencedClass/before/B.java | 4 ++++ .../packageAndReferencedClass/before/a/A.java | 2 ++ .../packageAndReferencedClass/before/b/C.java | 2 ++ .../intellij/refactoring/MovePackageTest.java | 18 +++++++++++++++--- 8 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/B.java create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/C.java create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/a/A.java create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/B.java create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/a/A.java create mode 100644 java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/b/C.java diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index 4fe261b153de..f9edca96cfdf 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -511,14 +511,14 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { myElementsToMove[idx] = element; } + myNonCodeUsages = CommonMoveUtil.retargetUsages(usages, oldToNewElementsMapping); + for (PsiElement element : myElementsToMove) { if (element instanceof PsiClass) { MoveClassesOrPackagesUtil.finishMoveClass((PsiClass)element); } } - myNonCodeUsages = CommonMoveUtil.retargetUsages(usages, oldToNewElementsMapping); - if (myOpenInEditor) { EditorHelper.openFilesInEditor(myElementsToMove); } diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/B.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/B.java new file mode 100644 index 000000000000..d6457aef6e16 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/B.java @@ -0,0 +1,6 @@ +package b; + +import b.a.A; +public class B { + A aa; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/C.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/C.java new file mode 100644 index 000000000000..beba5243f562 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/C.java @@ -0,0 +1,2 @@ +package b; +class C {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/a/A.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/a/A.java new file mode 100644 index 000000000000..4cc1ad36b90a --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/after/b/a/A.java @@ -0,0 +1,2 @@ +package b.a; +public class A {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/B.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/B.java new file mode 100644 index 000000000000..a17e968da5fa --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/B.java @@ -0,0 +1,4 @@ +import a.A; +public class B { + A aa; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/a/A.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/a/A.java new file mode 100644 index 000000000000..c40d43155dc2 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/a/A.java @@ -0,0 +1,2 @@ +package a; +public class A {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/b/C.java b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/b/C.java new file mode 100644 index 000000000000..beba5243f562 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackage/packageAndReferencedClass/before/b/C.java @@ -0,0 +1,2 @@ +package b; +class C {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageTest.java index d60e7f0f90f4..caf741958725 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageTest.java @@ -15,14 +15,16 @@ */ package com.intellij.refactoring; +import com.intellij.JavaTestUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPackage; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesProcessor; import com.intellij.refactoring.move.moveClassesOrPackages.SingleSourceRootMoveDestination; -import com.intellij.JavaTestUtil; import org.jetbrains.annotations.NotNull; public class MovePackageTest extends MultiFileTestCase { @@ -49,6 +51,12 @@ public class MovePackageTest extends MultiFileTestCase { doTest(new String[]{"a"}, "a.b"); } + public void testPackageAndReferencedClass() throws Exception { + Project project = myPsiManager.getProject(); + JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + doTest((rootDir, rootAfter) -> performAction(new PsiElement[]{facade.findPackage("a"), facade.findClass("B", GlobalSearchScope.allScope(project))}, "b")); + } + @NotNull @Override protected String getTestRoot() { @@ -67,12 +75,16 @@ public class MovePackageTest extends MultiFileTestCase { assertNotNull("Package " + packageName + " not found", packages[i]); } + performAction(packages, newPackageName); + } + + private void performAction(PsiElement[] packagesAndClasses, String newPackageName) { PsiPackage newParentPackage = JavaPsiFacade.getInstance(myPsiManager.getProject()).findPackage(newPackageName); assertNotNull(newParentPackage); final PsiDirectory[] dirs = newParentPackage.getDirectories(); assertEquals(dirs.length, 1); - new MoveClassesOrPackagesProcessor(myProject, packages, + new MoveClassesOrPackagesProcessor(myProject, packagesAndClasses, new SingleSourceRootMoveDestination(PackageWrapper.create(newParentPackage), dirs[0]), true, false, null).run(); FileDocumentManager.getInstance().saveAllDocuments();