move static members with static non-demand imports to preseve non-demand (IDEADEV-40862)

This commit is contained in:
anna
2009-10-16 14:29:15 +04:00
parent 373fa2287c
commit a9a8372082
9 changed files with 48 additions and 5 deletions

View File

@@ -71,7 +71,7 @@ public class MoveJavaMemberHandler implements MoveMemberHandler {
return null;
}
private boolean isInMovedElement(PsiElement element, Set<PsiMember> membersToMove) {
private static boolean isInMovedElement(PsiElement element, Set<PsiMember> membersToMove) {
for (PsiMember member : membersToMove) {
if (PsiTreeUtil.isAncestor(member, element, false)) return true;
}
@@ -86,7 +86,7 @@ public class MoveJavaMemberHandler implements MoveMemberHandler {
PsiExpression qualifier = refExpr.getQualifierExpression();
if (qualifier != null) {
if (usage.qualifierClass != null) {
changeQualifier(refExpr, usage.qualifierClass);
changeQualifier(refExpr, usage.qualifierClass, usage.member);
}
else {
refExpr.setQualifierExpression(null);
@@ -94,7 +94,7 @@ public class MoveJavaMemberHandler implements MoveMemberHandler {
}
else { // no qualifier
if (usage.qualifierClass != null) {
changeQualifier(refExpr, usage.qualifierClass);
changeQualifier(refExpr, usage.qualifierClass, usage.member);
}
}
return true;
@@ -136,11 +136,11 @@ public class MoveJavaMemberHandler implements MoveMemberHandler {
ChangeContextUtil.decodeContextInfo(scope, null, null);
}
private void changeQualifier(PsiReferenceExpression refExpr, PsiClass aClass) throws IncorrectOperationException {
private static void changeQualifier(PsiReferenceExpression refExpr, PsiClass aClass, PsiMember member) throws IncorrectOperationException {
if (RefactoringUtil.hasOnDemandStaticImport(refExpr, aClass)) {
refExpr.setQualifierExpression(null);
}
else {
else if (!RefactoringUtil.hasStaticImportOn(refExpr, member.getContainingClass(), member)){
PsiElementFactory factory = JavaPsiFacade.getInstance(refExpr.getProject()).getElementFactory();
refExpr.setQualifierExpression(factory.createReferenceExpression(aClass));
}

View File

@@ -224,6 +224,21 @@ public class RefactoringUtil {
return false;
}
public static boolean hasStaticImportOn(final PsiReferenceExpression expr, final PsiClass aClass, final PsiMember member) {
if (expr.getContainingFile() instanceof PsiJavaFile) {
final PsiImportList importList = ((PsiJavaFile)expr.getContainingFile()).getImportList();
if (importList != null) {
final PsiImportStaticStatement[] importStaticStatements = importList.getImportStaticStatements();
for(PsiImportStaticStatement stmt: importStaticStatements) {
if (!stmt.isOnDemand() && stmt.resolveTargetClass() == aClass && Comparing.strEqual(stmt.getReferenceName(), member.getName())) {
return true;
}
}
}
}
return false;
}
public static PsiElement replaceElementsWithMap(PsiElement replaceIn, final Map<PsiElement, PsiElement> elementsToReplace) throws IncorrectOperationException {
for(Map.Entry<PsiElement, PsiElement> e: elementsToReplace.entrySet()) {
if (e.getKey() == replaceIn) {

View File

@@ -0,0 +1,7 @@
import static B.Z;
public class A {
public static void main(String[] args) {
System.out.println("Z = " + Z);
}
}

View File

@@ -0,0 +1,3 @@
public class B {
public static final String Z = "z";
}

View File

@@ -0,0 +1,2 @@
public class C {
}

View File

@@ -0,0 +1,7 @@
import static C.Z;
public class A {
public static void main(String[] args) {
System.out.println("Z = " + Z);
}
}

View File

@@ -0,0 +1,2 @@
public class B {
}

View File

@@ -0,0 +1,3 @@
public class C {
public static final String Z = "z";
}

View File

@@ -69,6 +69,10 @@ public class MoveMembersTest extends MultiFileTestCase {
doTest("C", "B", 0);
}
public void testExplicitStaticImport() throws Exception {
doTest("C", "B", 0);
}
public void testProtectedConstructor() throws Exception {
doTest("pack1.A", "pack1.C", 0);
}