From cde47646e57a27a37b0c8b3c95556085efb3a834 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 29 May 2015 17:38:33 +0200 Subject: [PATCH] move inner to upper level: don't remove qualifier from inner types used in extends/implements list (IDEA-140839) --- .../move/moveInner/MoveInnerProcessor.java | 13 ++++++++----- .../innerInnerClassUsedInTypeParams/after/p/A.java | 8 ++++++++ .../after/p/Main.java | 6 ++++++ .../before/p/Main.java | 10 ++++++++++ .../com/intellij/refactoring/MoveInnerTest.java | 4 ++++ 5 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/A.java create mode 100644 java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/Main.java create mode 100644 java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/before/p/Main.java diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java index a95d6ef78a7f..fb76c4ad7687 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java @@ -20,8 +20,6 @@ import com.intellij.codeInsight.CodeInsightUtilCore; import com.intellij.ide.util.EditorHelper; import com.intellij.lang.findUsages.DescriptiveNameUtil; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; @@ -38,7 +36,9 @@ import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil; import com.intellij.refactoring.rename.RenameUtil; -import com.intellij.refactoring.util.*; +import com.intellij.refactoring.util.ConflictsUtil; +import com.intellij.refactoring.util.NonCodeUsageInfo; +import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.Function; @@ -193,8 +193,11 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { PsiJavaCodeReferenceElement parentRef = (PsiJavaCodeReferenceElement)element.getParent(); PsiElement parentRefElement = parentRef.resolve(); if (parentRefElement instanceof PsiClass) { // reference to inner class inside our inner - parentRef.getQualifier().delete(); - continue; + final PsiReferenceList referenceList = PsiTreeUtil.getTopmostParentOfType(parentRef, PsiReferenceList.class); + if (referenceList == null || referenceList.getParent() != newClass) { + parentRef.getQualifier().delete(); + continue; + } } } ref.bindToElement(newClass); diff --git a/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/A.java b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/A.java new file mode 100644 index 000000000000..c28a8708f62a --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/A.java @@ -0,0 +1,8 @@ +package p; + +import java.util.List; + +abstract class A implements List { + static class B { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/Main.java b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/Main.java new file mode 100644 index 000000000000..97a22e77614a --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/after/p/Main.java @@ -0,0 +1,6 @@ +package p; + +import java.util.List; + +public class Main { +} diff --git a/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/before/p/Main.java b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/before/p/Main.java new file mode 100644 index 000000000000..3f22633d29f3 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/innerInnerClassUsedInTypeParams/before/p/Main.java @@ -0,0 +1,10 @@ +package p; + +import java.util.List; + +public class Main { + static abstract class A implements List { + static class B { + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java index c56ff8219d1f..f0ef6cdbc931 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java @@ -101,6 +101,10 @@ public class MoveInnerTest extends MultiFileTestCase { doTest(createAction("p.A.E", "E", false, null, false, false, null)); } + public void testInnerInnerClassUsedInTypeParams() throws Exception { + doTest(createAction("p.Main.A", "A", false, null, false, false, null)); + } + public void testEnumConstructorVisibility() throws Exception { // IDEADEV-28619 doTest(createAction("p.A.E", "E", false, null, false, false, "p2")); }