mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
rename: find collisions with static imported members in findUsages
This commit is contained in:
@@ -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
@@ -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;
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user