rename: do not conflict if class type parameter and type param defined inside class in static context (IDEA-57427)

This commit is contained in:
anna
2010-11-19 12:07:03 +03:00
parent 0e62425248
commit 507d46e114
4 changed files with 29 additions and 0 deletions
@@ -26,6 +26,7 @@ import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
@@ -33,6 +34,7 @@ import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.refactoring.util.MoveRenameUsageInfo;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NonNls;
@@ -176,6 +178,15 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor {
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(referenceElement.getProject()).getResolveHelper();
final PsiClass aClass = resolveHelper.resolveReferencedClass(newName, referenceElement);
if (aClass == null) return;
if (aClass instanceof PsiTypeParameter && myRenamedClass instanceof PsiTypeParameter) {
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 (member.hasModifierProperty(PsiModifier.STATIC)) return;
}
}
}
final PsiFile containingFile = referenceElement.getContainingFile();
final String text = referenceElement.getText();
if (Comparing.equal(myRenamedClassQualifiedName, removeSpaces(text))) return;
@@ -0,0 +1,7 @@
public class Holder<E> {
private final E elem;
private Holder(E elem) { this.elem = elem; }
public static <<caret>X> Holder<X> of(X elem) { return new Holder<X>(elem); }
}
@@ -0,0 +1,7 @@
public class Holder<E> {
private final E elem;
private Holder(E elem) { this.elem = elem; }
public static <E> Holder<E> of(E elem) { return new Holder<E>(elem); }
}
@@ -169,6 +169,10 @@ public class RenameCollisionsTest extends LightCodeInsightTestCase {
doTest("C");
}
public void testRenameStaticMethodTypeParameter() throws Exception {
doTest("E");
}
private void doTest(final String newName) throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");
PsiElement element = TargetElementUtilBase