From eed3a9b8da0fe7955e77331710f15968aeff8558 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 7 Aug 2018 13:26:20 +0200 Subject: [PATCH] inline super: push class initializers as well (IDEA-172790) --- .../memberPushDown/JavaPushDownDelegate.java | 5 ++++- .../refactoring/util/classMembers/MemberInfo.java | 13 ++++++++++++- .../classInitializers/after/Test.java | 13 +++++++++++++ .../classInitializers/before/Super.java | 9 +++++++++ .../classInitializers/before/Test.java | 5 +++++ .../java/refactoring/InlineSuperClassTest.java | 1 + 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/after/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java index 6ed0a8893b5a..6b63c4da8932 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java @@ -329,6 +329,9 @@ public class JavaPushDownDelegate extends PushDownDelegate memberInfo : pushDownData.getMembersToMove()) { final PsiElement member = memberInfo.getMember(); - if (member instanceof PsiField) { + if (member instanceof PsiField || member instanceof PsiClassInitializer) { member.delete(); } else if (member instanceof PsiMethod) { diff --git a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfo.java b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfo.java index 253dc001aa0d..b7d0bcd10804 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfo.java @@ -20,9 +20,9 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.classMembers.MemberInfoBase; -import java.util.HashSet; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -79,6 +79,11 @@ public class MemberInfo extends MemberInfoBase { } isStatic = aClass.hasModifierProperty(PsiModifier.STATIC); } + else if (member instanceof PsiClassInitializer) { + isStatic = member.hasModifierProperty(PsiModifier.STATIC); + overrides = null; + displayName = isStatic ? "static {...}" : "{...}"; + } else { LOG.assertTrue(false); isStatic = false; @@ -129,6 +134,12 @@ public class MemberInfo extends MemberInfoBase { result.add(new MemberInfo(field)); } } + + for (PsiClassInitializer initializer : subclass.getInitializers()) { + if (filter.includeMember(initializer)) { + result.add(new MemberInfo(initializer)); + } + } } private static void extractSuperInterfaces(final PsiClass subclass, diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/after/Test.java new file mode 100644 index 000000000000..0da200cc1e9b --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/after/Test.java @@ -0,0 +1,13 @@ +class Test { + static { + System.out.println("static"); + } + + { + System.out.println("instance"); + } + + void foo() { + Test s = new Test(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Super.java new file mode 100644 index 000000000000..dd70ab38086c --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Super.java @@ -0,0 +1,9 @@ +class Super { + { + System.out.println("instance"); + } + + static { + System.out.println("static"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Test.java new file mode 100644 index 000000000000..da3346d01ea7 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/classInitializers/before/Test.java @@ -0,0 +1,5 @@ +class Test extends Super{ + void foo() { + Super s = new Super(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/InlineSuperClassTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/InlineSuperClassTest.java index 2d4aa44e8a7b..4916e84ad061 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/InlineSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/InlineSuperClassTest.java @@ -53,6 +53,7 @@ public class InlineSuperClassTest extends MultiFileTestCase { public void testConflictMultipleConstructors() { doTest(true, false); } public void testMultipleConstructors() { doTest(); } public void testImplicitChildConstructor() { doTest(); } + public void testClassInitializers() { doTest(); } public void testStaticMembers() { doTest(); } public void testSuperReference() { doTest(); } public void testInnerClassReference() { doTest(); }