resolve conflict on type param rename (IDEA-57326)

This commit is contained in:
anna
2013-10-25 14:09:21 +02:00
parent 54daf97cbd
commit cda0ea9783
4 changed files with 53 additions and 9 deletions
@@ -38,7 +38,7 @@ import com.intellij.refactoring.util.MoveRenameUsageInfo;
import com.intellij.refactoring.util.RefactoringUIUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.containers.MultiMap;
@@ -72,7 +72,11 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor {
if (usage instanceof CollidingClassImportUsageInfo) {
((CollidingClassImportUsageInfo)usage).getImportStatement().delete();
} else if (usage instanceof MemberHidesOuterMemberUsageInfo) {
hidesOut.add((MemberHidesOuterMemberUsageInfo)usage);
final PsiElement usageElement = usage.getElement();
final PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)usageElement;
if (collidingRef != null) {
hidesOut.add(new MemberHidesOuterMemberUsageInfo(usageElement, (PsiClass)collidingRef.resolve()));
}
}
else {
postponedCollisions.add(usage);
@@ -105,13 +109,25 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor {
collision.resolveCollision();
}
/*for (MemberHidesOuterMemberUsageInfo usage : hidesOut) {
for (MemberHidesOuterMemberUsageInfo usage : hidesOut) {
PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)usage.getElement();
PsiReferenceExpression ref = RenameJavaMemberProcessor.createQualifiedMemberReference(aClass, collidingRef);
collidingRef.replace(ref);
}*/
PsiMember member = (PsiMember)usage.getReferencedElement();
if (collidingRef != null && collidingRef.isValid() && member != null && member.isValid()) {
final PsiManager manager = member.getManager();
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(member.getProject());
final String name = member.getName();
final PsiClass containingClass = member.getContainingClass();
if (name != null && containingClass != null) {
if (manager.areElementsEquivalent(factory.createReferenceFromText(name, collidingRef).resolve(), member)) continue;
final PsiJavaCodeReferenceElement ref = factory.createReferenceFromText("A." + name, collidingRef);
final PsiJavaCodeReferenceElement qualifier = (PsiJavaCodeReferenceElement)ref.getQualifier();
LOG.assertTrue(qualifier != null);
final PsiJavaCodeReferenceElement classReference = factory.createClassReferenceElement(containingClass);
qualifier.replace(classReference);
collidingRef.replace(ref);
}
}
}
if (listener != null) {
listener.elementRenamed(aClass);
}
@@ -252,7 +268,7 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor {
final PsiTypeParameterListOwner member = PsiTreeUtil.getParentOfType(referenceElement, PsiTypeParameterListOwner.class);
if (member != null) {
final PsiTypeParameterList typeParameterList = member.getTypeParameterList();
if (typeParameterList != null && ArrayUtil.find(typeParameterList.getTypeParameters(), myRenamedClass) > -1) {
if (typeParameterList != null && ArrayUtilRt.find(typeParameterList.getTypeParameters(), myRenamedClass) > -1) {
if (member.hasModifierProperty(PsiModifier.STATIC)) return;
}
}
@@ -0,0 +1,12 @@
abstract class A{
class T{}
abstract T foo();
}
class B<<caret>S> extends A{
void foo(T x){}
@Override
T foo() {
return null;
}
}
@@ -0,0 +1,12 @@
abstract class A{
class T{}
abstract T foo();
}
class B<T> extends A{
void foo(A.T x){}
@Override
A.T foo() {
return null;
}
}
@@ -217,6 +217,10 @@ public class RenameCollisionsTest extends LightRefactoringTestCase {
doTest("gg");
}
public void testRenameTypeParamToSuper() throws Exception {
doTest("T");
}
private void doTest(final String newName) throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");
PsiElement element = TargetElementUtilBase