rename: find collisions with static imported members in findUsages

This commit is contained in:
anna
2010-01-20 12:51:44 +03:00
parent 46248b943c
commit 8fdf313fe3
11 changed files with 48 additions and 42 deletions
@@ -18,15 +18,18 @@ package com.intellij.refactoring.rename;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.containers.HashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author yole
@@ -148,39 +151,44 @@ public abstract class RenameJavaMemberProcessor extends RenamePsiElementProcesso
if (!memberToRename.isPhysical()) {
return;
}
final List<PsiReference> potentialConflicts = new ArrayList<PsiReference>();
PsiMember prototype = (PsiMember)memberToRename.copy();
try {
((PsiNamedElement)prototype).setName(newName);
if (prototype instanceof PsiEnumConstant) {
final PsiEnumConstantInitializer initializer = ((PsiEnumConstant)prototype).getInitializingClass();
if (initializer != null) {
// avoid assertion in PsiEnumConstantInitializerImpl.getClassReference() because
// an initializer existing 'in the air' validates the invariant (IDEADEV-28840)
initializer.delete();
final PsiFile containingFile = memberToRename.getContainingFile();
if (containingFile instanceof PsiJavaFile) {
final PsiImportList importList = ((PsiJavaFile)containingFile).getImportList();
if (importList != null) {
for (PsiImportStaticStatement staticImport : importList.getImportStaticStatements()) {
final String referenceName = staticImport.getReferenceName();
if (referenceName != null && !referenceName.equals(newName)) {
continue;
}
final PsiClass targetClass = staticImport.resolveTargetClass();
if (targetClass != null) {
final Set<PsiMember> importedMembers = new HashSet<PsiMember>();
if (memberToRename instanceof PsiMethod) {
for (PsiMethod method : targetClass.findMethodsByName(newName, true)) {
if (method.getModifierList().hasModifierProperty(PsiModifier.STATIC)) {
importedMembers.add(method);
}
}
}
else if (memberToRename instanceof PsiField) {
final PsiField fieldByName = targetClass.findFieldByName(newName, true);
if (fieldByName != null) {
importedMembers.add(fieldByName);
}
}
for (PsiMember member : importedMembers) {
ReferencesSearch.search(member, new LocalSearchScope(containingFile), true).forEach(new Processor<PsiReference>() {
public boolean process(final PsiReference psiReference) {
potentialConflicts.add(psiReference);
return true;
}
});
}
}
}
}
else if (prototype instanceof PsiField) {
final PsiExpression initializer = ((PsiField)prototype).getInitializer();
if (initializer != null) {
initializer.delete();
}
}
prototype = (PsiMember)memberToRename.getContainingClass().add(prototype);
ReferencesSearch.search(prototype).forEach(new Processor<PsiReference>() {
public boolean process(final PsiReference psiReference) {
potentialConflicts.add(psiReference);
return true;
}
});
prototype.delete();
}
catch (IncorrectOperationException e) {
LOG.error(e);
return;
}
for (PsiReference potentialConflict : potentialConflicts) {
@@ -72,7 +72,9 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor {
PsiElement element = usage.getElement();
if (element == null) continue;
if (usage instanceof MemberHidesOuterMemberUsageInfo) {
if (usage instanceof MemberHidesStaticImportUsageInfo) {
staticImportHides.add((MemberHidesStaticImportUsageInfo)usage);
} else if (usage instanceof MemberHidesOuterMemberUsageInfo) {
PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)element;
PsiMethod resolved = (PsiMethod)collidingRef.resolve();
outerHides.add(new MemberHidesOuterMemberUsageInfo(element, resolved));
@@ -146,6 +148,7 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor {
final PsiMethod methodToRename = (PsiMethod)element;
findSubmemberHidesMemberCollisions(methodToRename, newName, result);
findMemberHidesOuterMemberCollisions((PsiMethod) element, newName, result);
findCollisionsAgainstNewName(methodToRename, newName, result);
}
public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap<PsiElement, String> conflicts) {
@@ -70,7 +70,9 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor {
final PsiElement element = usage.getElement();
if (element == null) continue;
if (usage instanceof LocalHidesFieldUsageInfo) {
if (usage instanceof MemberHidesStaticImportUsageInfo) {
staticImportHides.add((MemberHidesStaticImportUsageInfo)usage);
} else if (usage instanceof LocalHidesFieldUsageInfo) {
PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)element;
PsiElement resolved = collidingRef.resolve();
@@ -230,6 +232,7 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor {
PsiField field = (PsiField) element;
findMemberHidesOuterMemberCollisions(field, newName, result);
findSubmemberHidesFieldCollisions(field, newName, result);
findCollisionsAgainstNewName(field, newName, result);
}
else if (element instanceof PsiLocalVariable || element instanceof PsiParameter) {
JavaUnresolvableLocalCollisionDetector.findCollisions(element, newName, result);
@@ -1,7 +1,6 @@
public class RenameCollisions {
public void <caret>innerMethod() {
}
class InnerClass {
public void innerMethod() {
}
@@ -1,9 +1,6 @@
import static java.lang.String.CASE_INSENSITIVE_ORDER;
public class RenameCollisions {
public static class StaticInnerClass {
public static final int CASE_INSENSITIVE_ORDER<caret> = 9;
public static void staticContext() {
String.CASE_INSENSITIVE_ORDER.getClass();
}
@@ -1,7 +1,6 @@
public class RenameCollisions {
private class InnerClass {
public static final int param3<caret> = 13;
public void instanceContext(int param3) {
int localVar3 = 0;
int var1 = localVar3 + param3 + InnerClass.param3;
@@ -1,7 +1,6 @@
public class RenameCollisions {
private class InnerClass {
private int localVar3<caret> = 15;
public void instanceContext(int param3) {
int localVar3 = 0;
int var1 = localVar3 + param3 + this.localVar3;
@@ -2,7 +2,6 @@ public class RenameCollisions {
public static final int STATIC_FIELD = 5;
private class InnerClass {
public static final int STATIC_FIELD<caret> = 13;
public void instanceContext(int param3) {
int localVar3 = 0;
int var1 = localVar3 + param3 + STATIC_FIELD + RenameCollisions.STATIC_FIELD;
@@ -2,7 +2,6 @@ public class RenameCollisions {
private int myField = 7;
private class InnerClass {
private int myField<caret> = 15;
public void instanceContext(int param3) {
int localVar3 = 0;
int var1 = localVar3 + param3 + myField + RenameCollisions.this.myField;
@@ -1,6 +1,6 @@
class A {
int <caret>fieldToBeRenamed;
int method(int newFieldName) {
if(newFieldName == 0) {
return fieldToBeRenamed;
@@ -1,5 +1,5 @@
class A {
int <caret>myField;
int <caret>myField;
}
class B {