Java: basic class initializer support for Pull Members Up refactoring (IDEA-315629)

GitOrigin-RevId: 75dd479b8ff332776bb238fe964cc9cf715b2404
This commit is contained in:
Bas Leijdekkers
2023-03-17 16:28:40 +01:00
committed by intellij-monorepo-bot
parent 21584d410d
commit d86a8f97da
7 changed files with 40 additions and 6 deletions

View File

@@ -79,7 +79,7 @@ public class JavaPullUpHandler implements PullUpDialog.Callback, ElementsHandler
break;
}
if (element instanceof PsiClass || element instanceof PsiField || element instanceof PsiMethod) {
if (element instanceof PsiMember) {
elements.add(element);
break;
}

View File

@@ -76,6 +76,12 @@ public class JavaPullUpHelper implements PullUpHelper<MemberInfo> {
else if (info.getMember() instanceof PsiClass) {
doMoveClass(substitutor, info);
}
else if (info.getMember() instanceof PsiClassInitializer initializer) {
PsiClassInitializer copy = (PsiClassInitializer)initializer.copy();
final PsiMember movedElement = (PsiMember)myTargetSuperClass.add(copy);
myMembersAfterMove.add(movedElement);
initializer.delete();
}
}
@Override
@@ -191,7 +197,7 @@ public class JavaPullUpHelper implements PullUpHelper<MemberInfo> {
field.delete();
}
private void doMoveMethod(PsiSubstitutor substitutor, MemberInfo info) {
private void doMoveMethod(PsiSubstitutor substitutor, MemberInfo info) {
PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(myProject);
PsiMethod method = (PsiMethod)info.getMember();
PsiMethod sibling = method;

View File

@@ -196,6 +196,9 @@ public class PullUpDialog extends PullUpDialogBase<MemberInfoStorage, MemberInfo
PsiModifierListOwner element = member.getMember();
if (element instanceof PsiClass && ((PsiClass) element).isInterface()) return true;
if (element instanceof PsiEnumConstant) {
return false;
}
if (element instanceof PsiField) {
return element.hasModifierProperty(PsiModifier.STATIC);
}
@@ -211,6 +214,9 @@ public class PullUpDialog extends PullUpDialogBase<MemberInfoStorage, MemberInfo
if (superClassMethod != null && !PsiUtil.isLanguageLevel8OrHigher(currentSuperClass)) return false;
return !element.hasModifierProperty(PsiModifier.STATIC) || PsiUtil.isLanguageLevel8OrHigher(currentSuperClass);
}
if (element instanceof PsiClassInitializer) {
return false;
}
return true;
}

View File

@@ -57,7 +57,7 @@ public class JavaPushDownHandler implements ElementsHandler, ContextAwareActionH
break;
}
if (element instanceof PsiClass || element instanceof PsiField || element instanceof PsiMethod) {
if (element instanceof PsiMember) {
elements.add(element);
break;
}

View File

@@ -0,0 +1,8 @@
class ClassInitializer extends Super {
static<caret> {
System.out.println();
}
}
class Super {
}

View File

@@ -0,0 +1,8 @@
class ClassInitializer extends Super {
}
class Super {
static {
System.out.println();
}
}

View File

@@ -21,7 +21,7 @@ import java.util.stream.Collectors;
public class PullUpTest extends LightRefactoringTestCase {
private static final String BASE_PATH = "/refactoring/pullUp/";
private static final String IGNORE_CONFLICTS = "IGNORE";
private static final String IGNORE_CONFLICTS = "IGNORE";
public void testQualifiedThis() {
doTest(new RefactoringTestUtil.MemberDescriptor("Inner", PsiClass.class));
@@ -224,6 +224,10 @@ public class PullUpTest extends LightRefactoringTestCase {
new RefactoringTestUtil.MemberDescriptor("bar", PsiMethod.class));
}
public void testClassInitializer() {
doTest();
}
public void testRenameConflictingTypeParameters() {
doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class, false));
}
@@ -281,7 +285,9 @@ public class PullUpTest extends LightRefactoringTestCase {
assertTrue(interfaces[0].isWritable());
targetClass = interfaces[0];
}
final MemberInfo[] infos = RefactoringTestUtil.findMembers(sourceClass, membersToFind);
final MemberInfo[] infos = membersToFind.length == 0
? new MemberInfo[]{new MemberInfo(PsiTreeUtil.getParentOfType(elementAt, PsiMember.class))}
: RefactoringTestUtil.findMembers(sourceClass, membersToFind);
final int[] countMoved = {0};
final MoveMemberListener listener = (aClass, member) -> {
@@ -316,7 +322,7 @@ public class PullUpTest extends LightRefactoringTestCase {
}
if (checkMembersMovedCount) {
assertEquals(countMoved[0], membersToFind.length);
assertEquals(membersToFind.length == 0 ? 1 : membersToFind.length, countMoved[0]);
}
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
}