[java-refactorings] Move Static Members produces red code when static import is present bug fix

IDEA-321620

GitOrigin-RevId: 78687728404da5953fd09c99066b8262583b8746
This commit is contained in:
Georgii Ustinov
2023-10-27 13:39:34 +03:00
committed by intellij-monorepo-bot
parent f6f43aed3e
commit 8e3d29b3f9
5 changed files with 63 additions and 8 deletions

View File

@@ -298,7 +298,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor {
}
}
UsageInfo[] infos = filtered.toArray(UsageInfo.EMPTY_ARRAY);
VisibilityUtil.fixVisibility(UsageViewUtil.toElements(infos), newMember, myNewVisibility);
VisibilityUtil.fixVisibility(UsageViewUtil.toElements(infos), newMember, newMember.getContainingFile(), myNewVisibility);
}
@Override

View File

@@ -11,9 +11,10 @@ import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class VisibilityUtil {
public final class VisibilityUtil {
@NonNls public static final String ESCALATE_VISIBILITY = "EscalateVisible";
private static final String[] visibilityModifiers = {
PsiModifier.PRIVATE,
@@ -44,13 +45,22 @@ public final class VisibilityUtil {
}
public static void escalateVisibility(PsiMember modifierListOwner, PsiElement place) throws IncorrectOperationException {
escalateVisibility(modifierListOwner, place, null);
}
public static void escalateVisibility(PsiMember modifierListOwner, PsiElement place, @Nullable PsiFile fileResolveScope)
throws IncorrectOperationException {
final String visibilityModifier = getVisibilityModifier(modifierListOwner.getModifierList());
int index;
for (index = 0; index < visibilityModifiers.length; index++) {
String modifier = visibilityModifiers[index];
if(modifier.equals(visibilityModifier)) break;
if (modifier.equals(visibilityModifier)) break;
}
for(;index < visibilityModifiers.length && !PsiUtil.isAccessible(modifierListOwner, place, null); index++) {
PsiResolveHelper psiResolveHelper = PsiResolveHelper.getInstance(place.getProject());
for (;
index < visibilityModifiers.length &&
!psiResolveHelper.isAccessible(modifierListOwner, modifierListOwner.getModifierList(), place, null, fileResolveScope);
index++) {
@PsiModifier.ModifierConstant String modifier = visibilityModifiers[index];
PsiUtil.setModifierProperty(modifierListOwner, modifier, true);
}
@@ -119,19 +129,28 @@ public final class VisibilityUtil {
}
public static void fixVisibility(PsiElement[] elements, PsiMember member, @PsiModifier.ModifierConstant String newVisibility) {
fixVisibility(elements, member, null, newVisibility);
}
public static void fixVisibility(PsiElement[] elements,
PsiMember member,
@Nullable PsiFile fileResolveScope,
@PsiModifier.ModifierConstant String newVisibility) {
if (newVisibility == null) return;
if (ESCALATE_VISIBILITY.equals(newVisibility)) {
for (PsiElement element : elements) {
if (element != null) {
escalateVisibility(member, element);
escalateVisibility(member, element, fileResolveScope);
}
}
} else {
setVisibility(member.getModifierList(), newVisibility);
}
else {
setVisibility(member.getModifierList(), newVisibility);
}
}
public static void setVisibility(@NotNull PsiModifierList modifierList, @PsiModifier.ModifierConstant @NotNull String newVisibility) throws IncorrectOperationException {
public static void setVisibility(@NotNull PsiModifierList modifierList, @PsiModifier.ModifierConstant @NotNull String newVisibility)
throws IncorrectOperationException {
modifierList.setModifierProperty(newVisibility, true);
if (newVisibility.equals(PsiModifier.PRIVATE)) {
modifierList.setModifierProperty(PsiModifier.DEFAULT, false);

View File

@@ -0,0 +1,16 @@
package pack;
import static pack.A.B.*;
public class A {
void run() {
z++;
foo();
}
static class B {
static int z = 10;
static void foo() {}
}
}

View File

@@ -0,0 +1,16 @@
package pack;
import static pack.A.B.*;
public class A {
void run() {
z++;
foo();
}
private static int z = 10;
private static void foo() {}
static class B {
}
}

View File

@@ -213,6 +213,10 @@ public class MoveMembersTest extends LightMultiFileTestCase {
doTest("A", "B", true, VisibilityUtil.ESCALATE_VISIBILITY, 0);
}
public void testEscalateVisibilityWhenMoveStaticMemberToStaticClass() {
doTest("pack.A", "pack.A.B", true, VisibilityUtil.ESCALATE_VISIBILITY, 1, 2);
}
public void testStringConstantInSwitchLabelExpression() {
doTest("A", "B", true, VisibilityUtil.ESCALATE_VISIBILITY, 0);
}