From 2504abd6bed3b7d7e848bf6574a57f1aa65c552f Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jun 2010 17:55:58 +0400 Subject: [PATCH] pull up: static class references should NOT be updated if that classe was pulled as well --- .../memberPullUp/PullUpHelper.java | 32 ++++++++++++++----- .../pullUp/PullUpInheritedStaticClasses.java | 8 +++++ .../PullUpInheritedStaticClasses_after.java | 10 ++++++ .../com/intellij/refactoring/PullUpTest.java | 5 +++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java create mode 100644 java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java index f05c59913260..8b5b90821a0a 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java @@ -30,6 +30,7 @@ import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.codeInsight.intention.AddAnnotationFix; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; @@ -60,6 +61,7 @@ import java.util.*; public class PullUpHelper extends BaseRefactoringProcessor{ private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.memberPullUp.PullUpHelper"); + private static final Key PRESERVE_QUALIFIER = Key.create("PRESERVE_QUALIFIER"); private final PsiClass mySourceClass; private final PsiClass myTargetSuperClass; private final boolean myIsTargetInterface; @@ -234,6 +236,20 @@ public class PullUpHelper extends BaseRefactoringProcessor{ ChangeContextUtil.decodeContextInfo(myTargetSuperClass, null, null); for (final PsiMember movedMember : myMembersAfterMove) { + movedMember.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + final PsiExpression qualifierExpression = expression.getQualifierExpression(); + if (qualifierExpression != null) { + final Boolean preserveQualifier = qualifierExpression.getCopyableUserData(PRESERVE_QUALIFIER); + if (preserveQualifier != null && !preserveQualifier) { + qualifierExpression.delete(); + return; + } + } + super.visitReferenceExpression(expression); + } + }); final JavaRefactoringListenerManager listenerManager = JavaRefactoringListenerManager.getInstance(movedMember.getProject()); ((JavaRefactoringListenerManagerImpl)listenerManager).fireMemberMoved(mySourceClass, movedMember); } @@ -632,7 +648,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ } private void fixReferencesToStatic(PsiElement classMember, Set movedMembers) throws IncorrectOperationException { - StaticReferencesCollector collector = new StaticReferencesCollector(movedMembers); + final StaticReferencesCollector collector = new StaticReferencesCollector(movedMembers); classMember.accept(collector); ArrayList refs = collector.getReferences(); ArrayList members = collector.getReferees(); @@ -649,18 +665,19 @@ public class PullUpHelper extends BaseRefactoringProcessor{ (PsiReferenceExpression) factory.createExpressionFromText ("a." + ((PsiNamedElement) namedElement).getName(), null); - final PsiExpression qualifierExpression = newRef.getQualifierExpression(); + PsiExpression qualifierExpression = newRef.getQualifierExpression(); assert qualifierExpression != null; - qualifierExpression.replace(factory.createReferenceExpression(aClass)); + qualifierExpression = (PsiExpression)qualifierExpression.replace(factory.createReferenceExpression(aClass)); + qualifierExpression.putCopyableUserData(PRESERVE_QUALIFIER, ref.isQualified()); ref.replace(newRef); } } } private class StaticReferencesCollector extends ClassMemberReferencesVisitor { - ArrayList myReferences; - ArrayList myReferees; - ArrayList myRefereeClasses; + private ArrayList myReferences; + private ArrayList myReferees; + private ArrayList myRefereeClasses; private final Set myMovedMembers; private StaticReferencesCollector(Set movedMembers) { @@ -684,7 +701,6 @@ public class PullUpHelper extends BaseRefactoringProcessor{ } protected void visitClassMemberReferenceElement(PsiMember classMember, PsiJavaCodeReferenceElement classMemberReference) { - if (classMember instanceof PsiClass) return; if (classMember.hasModifierProperty(PsiModifier.STATIC)) { if (!myMovedMembers.contains(classMember) && RefactoringHierarchyUtil.isMemberBetween(myTargetSuperClass, mySourceClass, classMember)) { @@ -692,7 +708,7 @@ public class PullUpHelper extends BaseRefactoringProcessor{ myReferees.add(classMember); myRefereeClasses.add(classMember.getContainingClass()); } - else if ((myMovedMembers.contains(classMember) || myMembersAfterMove.contains(classMember)) && classMemberReference.isQualified()) { + else if (myMovedMembers.contains(classMember) || myMembersAfterMove.contains(classMember)) { myReferences.add(classMemberReference); myReferees.add(classMember); myRefereeClasses.add(myTargetSuperClass); diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java new file mode 100644 index 000000000000..48cc5066e1f4 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses.java @@ -0,0 +1,8 @@ +public class A extends AA { + + static class C extends D {} + static class D extends B {} + static class B {} +} + +class AA {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java new file mode 100644 index 000000000000..f11aabb892d3 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpInheritedStaticClasses_after.java @@ -0,0 +1,10 @@ +public class A extends AA { + + static class B {} +} + +class AA { + static class C extends D {} + + static class D extends A.B {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index 52149292c41a..d5fe5eedc979 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -36,6 +36,11 @@ public class PullUpTest extends LightCodeInsightTestCase { new RefactoringTestUtil.MemberDescriptor("setX", PsiMethod.class)); } + + public void testPullUpInheritedStaticClasses() throws Exception { + doTest(new RefactoringTestUtil.MemberDescriptor("C", PsiClass.class), + new RefactoringTestUtil.MemberDescriptor("D", PsiClass.class)); + } public void testPullUpAndAbstractize() throws Exception { doTest(new RefactoringTestUtil.MemberDescriptor("a", PsiMethod.class),