From 8fdf313fe31827cb4667b045ec5362ea71b9e634 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 19 Jan 2010 18:48:17 +0300 Subject: [PATCH] rename: find collisions with static imported members in findUsages --- .../rename/RenameJavaMemberProcessor.java | 68 +++++++++++-------- .../rename/RenameJavaMethodProcessor.java | 5 +- .../rename/RenameJavaVariableProcessor.java | 5 +- ...hodOuterInstanceToInnerInstance.java.after | 1 - .../RenameVarConstToAlien.java.after | 3 - .../RenameVarConstToParam.java.after | 1 - .../RenameVarFieldToLocal.java.after | 1 - ...RenameVarInnerConstToOuterConst.java.after | 1 - ...RenameVarInnerFieldToOuterField.java.after | 1 - .../renameField/beforeCollisionsInMethod.java | 2 +- .../beforeSimpleFieldRenaming.java | 2 +- 11 files changed, 48 insertions(+), 42 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java index b3564aa1e673..46e22d6b03bb 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java @@ -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 potentialConflicts = new ArrayList(); - 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 importedMembers = new HashSet(); + 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() { + 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() { - public boolean process(final PsiReference psiReference) { - potentialConflicts.add(psiReference); - return true; - } - }); - - prototype.delete(); - } - catch (IncorrectOperationException e) { - LOG.error(e); - return; } for (PsiReference potentialConflict : potentialConflicts) { diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java index 84cbf69b9995..4b1f85c9d30e 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -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 conflicts) { diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java index e37d09f19609..9183a46d3f21 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java @@ -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); diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameMethodOuterInstanceToInnerInstance.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameMethodOuterInstanceToInnerInstance.java.after index aca9a570b295..a7043487dee9 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameMethodOuterInstanceToInnerInstance.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameMethodOuterInstanceToInnerInstance.java.after @@ -1,7 +1,6 @@ public class RenameCollisions { public void innerMethod() { } - class InnerClass { public void innerMethod() { } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToAlien.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToAlien.java.after index 2e50e09768c7..96917013c1ad 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToAlien.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToAlien.java.after @@ -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 = 9; - public static void staticContext() { String.CASE_INSENSITIVE_ORDER.getClass(); } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToParam.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToParam.java.after index 8251a43ea138..caeaa9543da7 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToParam.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarConstToParam.java.after @@ -1,7 +1,6 @@ public class RenameCollisions { private class InnerClass { public static final int param3 = 13; - public void instanceContext(int param3) { int localVar3 = 0; int var1 = localVar3 + param3 + InnerClass.param3; diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarFieldToLocal.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarFieldToLocal.java.after index 17a80a01c74e..11881c63e63a 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarFieldToLocal.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarFieldToLocal.java.after @@ -1,7 +1,6 @@ public class RenameCollisions { private class InnerClass { private int localVar3 = 15; - public void instanceContext(int param3) { int localVar3 = 0; int var1 = localVar3 + param3 + this.localVar3; diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerConstToOuterConst.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerConstToOuterConst.java.after index ee4296e5b353..17456c19f719 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerConstToOuterConst.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerConstToOuterConst.java.after @@ -2,7 +2,6 @@ public class RenameCollisions { public static final int STATIC_FIELD = 5; private class InnerClass { public static final int STATIC_FIELD = 13; - public void instanceContext(int param3) { int localVar3 = 0; int var1 = localVar3 + param3 + STATIC_FIELD + RenameCollisions.STATIC_FIELD; diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerFieldToOuterField.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerFieldToOuterField.java.after index 80864c381364..39fb6e17e0f4 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerFieldToOuterField.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarInnerFieldToOuterField.java.after @@ -2,7 +2,6 @@ public class RenameCollisions { private int myField = 7; private class InnerClass { private int myField = 15; - public void instanceContext(int param3) { int localVar3 = 0; int var1 = localVar3 + param3 + myField + RenameCollisions.this.myField; diff --git a/java/java-tests/testData/refactoring/renameField/beforeCollisionsInMethod.java b/java/java-tests/testData/refactoring/renameField/beforeCollisionsInMethod.java index a047d32a73f9..825b18031c11 100644 --- a/java/java-tests/testData/refactoring/renameField/beforeCollisionsInMethod.java +++ b/java/java-tests/testData/refactoring/renameField/beforeCollisionsInMethod.java @@ -1,6 +1,6 @@ class A { int fieldToBeRenamed; - + int method(int newFieldName) { if(newFieldName == 0) { return fieldToBeRenamed; diff --git a/java/java-tests/testData/refactoring/renameField/beforeSimpleFieldRenaming.java b/java/java-tests/testData/refactoring/renameField/beforeSimpleFieldRenaming.java index 575525bf4edf..f20fc870876f 100644 --- a/java/java-tests/testData/refactoring/renameField/beforeSimpleFieldRenaming.java +++ b/java/java-tests/testData/refactoring/renameField/beforeSimpleFieldRenaming.java @@ -1,5 +1,5 @@ class A { - int myField; + int myField; } class B {