mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
resolve conflict on type param rename (IDEA-57326)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
+12
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user