From ff23f22e9a5c2b6545f40ca4ce4da762042e76be Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 31 Oct 2018 10:12:18 +0100 Subject: [PATCH] move inner to upper level: ensure inserted imports on inner classes are updated (IDEA-200882) --- .../refactoring/move/moveInner/MoveInnerProcessor.java | 7 ++++++- .../mostInnerClassImport/after/pack1/Inner.java | 7 +++++++ .../mostInnerClassImport/after/pack1/Outer.java | 4 ++++ .../mostInnerClassImport/before/pack1/Outer.java | 9 +++++++++ .../com/intellij/java/refactoring/MoveInnerTest.java | 8 ++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Inner.java create mode 100644 java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Outer.java create mode 100644 java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/before/pack1/Outer.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 3df2132081ed..f3d20ab8bede 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 @@ -192,12 +192,17 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { } // replace references in a new class to old inner class with references to itself - for (PsiReference ref : ReferencesSearch.search(myInnerClass, new LocalSearchScope(newClass), true)) { + for (PsiReference ref : ReferencesSearch.search(myInnerClass, new LocalSearchScope(newClass.getContainingFile()), true)) { PsiElement element = ref.getElement(); if (element.getParent() instanceof PsiJavaCodeReferenceElement) { PsiJavaCodeReferenceElement parentRef = (PsiJavaCodeReferenceElement)element.getParent(); PsiElement parentRefElement = parentRef.resolve(); if (parentRefElement instanceof PsiClass) { // reference to inner class inside our inner + PsiImportStatementBase insertedImport = PsiTreeUtil.getParentOfType(parentRef, PsiImportStatementBase.class); + if (insertedImport != null) { + insertedImport.delete(); + continue; + } final PsiReferenceList referenceList = PsiTreeUtil.getTopmostParentOfType(parentRef, PsiReferenceList.class); if (referenceList == null || referenceList.getParent() != newClass) { parentRef.getQualifier().delete(); diff --git a/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Inner.java b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Inner.java new file mode 100644 index 000000000000..6373de5014c1 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Inner.java @@ -0,0 +1,7 @@ +package pack1; + +public class Inner { + private final MostInner innerMost = new MostInner(); + + public class MostInner {} +} diff --git a/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Outer.java b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Outer.java new file mode 100644 index 000000000000..90d8f9ceff35 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/after/pack1/Outer.java @@ -0,0 +1,4 @@ +package pack1; + +public class Outer { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/before/pack1/Outer.java b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/before/pack1/Outer.java new file mode 100644 index 000000000000..8357042993ea --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/mostInnerClassImport/before/pack1/Outer.java @@ -0,0 +1,9 @@ +package pack1; + +public class Outer { + public static class Inner { + private final MostInner innerMost = new MostInner(); + + public class MostInner {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/MoveInnerTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/MoveInnerTest.java index dc4130c56edb..5467b7877eb4 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/MoveInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/MoveInnerTest.java @@ -16,9 +16,11 @@ package com.intellij.java.refactoring; import com.intellij.JavaTestUtil; +import com.intellij.application.options.CodeStyle; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.BaseRefactoringProcessor; @@ -61,6 +63,12 @@ public class MoveInnerTest extends MultiFileTestCase { doTest(createAction("pack1.Outer.Inner", "Inner", false, null, true, true, null)); } + public void testMostInnerClassImport() { + JavaCodeStyleSettings javaCodeStyleSettings = CodeStyle.getSettings(getProject()).getCustomSettings(JavaCodeStyleSettings.class); + javaCodeStyleSettings.INSERT_INNER_CLASS_IMPORTS = true; + doTest(createAction("pack1.Outer.Inner", "Inner", false, null, true, true, null)); + } + public void testScr22592() { doTest(createAction("xxx.Outer.Inner", "Inner", true, "outer", false, false, null)); }