diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java index 880dd0812573..0e1f7bd4fede 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java @@ -39,6 +39,7 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -301,7 +302,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { myChangeInfo.updateMethod((PsiMethod) elements[0]); } - private void addMethodConflicts(Map conflicts) { + private void addMethodConflicts(MultiMap conflicts) { String newMethodName = myChangeInfo.newName; try { @@ -338,10 +339,10 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(Ref refUsages) { - Map conflictDescriptions = new HashMap(); + MultiMap conflictDescriptions = new MultiMap(); UsageInfo[] usagesIn = refUsages.get(); addMethodConflicts(conflictDescriptions); - conflictDescriptions.putAll(RenameUtil.getConflictDescriptions(usagesIn)); + RenameUtil.addConflictDescriptions(usagesIn, conflictDescriptions); Set usagesSet = new HashSet(Arrays.asList(usagesIn)); RenameUtil.removeConflictUsages(usagesSet); if (myChangeInfo.isVisibilityChanged) { @@ -371,7 +372,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { return true; } - private void addInaccessibilityDescriptions(Set usages, Map conflictDescriptions) throws IncorrectOperationException { + private void addInaccessibilityDescriptions(Set usages, MultiMap conflictDescriptions) throws IncorrectOperationException { PsiMethod method = myChangeInfo.getMethod(); PsiModifierList modifierList = (PsiModifierList)method.getModifierList().copy(); RefactoringUtil.setVisibility(modifierList, myNewVisibility); @@ -394,7 +395,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { RefactoringUIUtil.getDescription(method, true), myNewVisibility, RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(element), true)); - conflictDescriptions.put(method, message); + conflictDescriptions.putValue(method, message); if (!needToChangeCalls()) { iterator.remove(); } diff --git a/java/java-impl/src/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java index f3009ecd0e53..020236bcb200 100644 --- a/java/java-impl/src/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java @@ -25,6 +25,7 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -117,20 +118,17 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(Ref refUsages) { UsageInfo[] usagesIn = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); final Set methods = Collections.singleton((PsiMember)myMethod); if (!myTargetClass.isInterface()) { final String original = VisibilityUtil.getVisibilityModifier(myMethod.getModifierList()); - conflicts.putAll( - MoveMembersProcessor.analyzeAccessibilityConflicts(methods, myTargetClass, new LinkedHashMap(), original)); + MoveMembersProcessor.analyzeAccessibilityConflicts(methods, myTargetClass, conflicts, original); } else { for (final UsageInfo usage : usagesIn) { if (usage instanceof ImplementingClassUsageInfo) { - conflicts.putAll(MoveMembersProcessor.analyzeAccessibilityConflicts(methods, - ((ImplementingClassUsageInfo)usage).getPsiClass(), - new LinkedHashMap(), - PsiModifier.PUBLIC)); + MoveMembersProcessor + .analyzeAccessibilityConflicts(methods, ((ImplementingClassUsageInfo)usage).getPsiClass(), conflicts, PsiModifier.PUBLIC); } } } @@ -147,7 +145,7 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor { String message = RefactoringBundle.message("0.contains.call.with.null.argument.for.parameter.1", RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(methodCall), true), CommonRefactoringUtil.htmlEmphasize(myTargetParameter.getName())); - conflicts.put(methodCall, message); + conflicts.putValue(methodCall, message); } } } @@ -163,7 +161,7 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor { return showConflicts(conflicts); } - private void addInaccessibilityConflicts(final UsageInfo[] usages, final Map conflicts) throws IncorrectOperationException { + private void addInaccessibilityConflicts(final UsageInfo[] usages, final MultiMap conflicts) throws IncorrectOperationException { final PsiModifierList copy = (PsiModifierList)myMethod.getModifierList().copy(); if (myNewVisibility != null) { if (myNewVisibility.equals(VisibilityUtil.ESCALATE_VISIBILITY)) { @@ -191,7 +189,7 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor { String message = RefactoringBundle.message("0.with.1.visibility.is.not.accesible.from.2", RefactoringUIUtil.getDescription(myMethod, true), newVisibility, RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(call), true)); - conflicts.put(myMethod, message); + conflicts.putValue(myMethod, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java index f37a4a621434..a757db8b8f63 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java @@ -18,12 +18,13 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringUtil; -import com.intellij.util.VisibilityUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -70,7 +71,7 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { } protected boolean preprocessUsages(Ref refUsages) { - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); if (myDialog != null) { checkExistingMethods(myDialog.getGetterPrototypes(), conflicts, true); @@ -90,7 +91,7 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { return true; } - private void checkExistingMethods(PsiMethod[] prototypes, Map conflicts, boolean isGetter) { + private void checkExistingMethods(PsiMethod[] prototypes, MultiMap conflicts, boolean isGetter) { if(prototypes == null) return; for (PsiMethod prototype : prototypes) { final PsiType prototypeReturnType = prototype.getReturnType(); @@ -108,7 +109,7 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { CommonRefactoringUtil.htmlEmphasize(prototype.getName())) : RefactoringBundle.message("encapsulate.fields.setter.exists", CommonRefactoringUtil.htmlEmphasize(descr), CommonRefactoringUtil.htmlEmphasize(prototype.getName())); - conflicts.put(existing, message); + conflicts.putValue(existing, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java index 4d034cfd961b..cc3384d79219 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java @@ -18,6 +18,7 @@ import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.NonFocusableCheckBox; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -26,8 +27,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.util.HashMap; -import java.util.Map; public class ExtractMethodDialog extends AbstractExtractDialog { @@ -151,7 +150,7 @@ public class ExtractMethodDialog extends AbstractExtractDialog { } protected void doOKAction() { - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); checkMethodConflicts(conflicts); if (!conflicts.isEmpty()) { final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); @@ -401,7 +400,7 @@ public class ExtractMethodDialog extends AbstractExtractDialog { return buffer; } - protected void checkMethodConflicts(Map conflicts) { + protected void checkMethodConflicts(MultiMap conflicts) { PsiMethod prototype; try { PsiElementFactory factory = JavaPsiFacade.getInstance(myProject).getElementFactory(); diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java index 43122b30f870..cbe6ad258fb0 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectDialog.java @@ -15,6 +15,7 @@ import com.intellij.refactoring.util.ParameterTablePanel; import com.intellij.ui.EditorTextField; import com.intellij.util.Function; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; @@ -23,8 +24,6 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; public class ExtractMethodObjectDialog extends AbstractExtractDialog { @@ -133,11 +132,11 @@ public class ExtractMethodObjectDialog extends AbstractExtractDialog { } protected void doOKAction() { - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); if (myCreateInnerClassRb.isSelected()) { final PsiClass innerClass = myTargetClass.findInnerClassByName(myInnerClassName.getText(), false); if (innerClass != null) { - conflicts.put(innerClass, "Inner class " + myInnerClassName.getText() + " already defined in class " + myTargetClass.getName()); + conflicts.putValue(innerClass, "Inner class " + myInnerClassName.getText() + " already defined in class " + myTargetClass.getName()); } } if (conflicts.size() > 0) { diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java index 547d32d6752d..a33f70ff716f 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java @@ -28,10 +28,10 @@ import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.LinkedHashMap; public class ExtractSuperclassHandler implements RefactoringActionHandler, ExtractSuperclassDialog.Callback, ElementsHandler { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.extractSuperclass.ExtractSuperclassHandler"); @@ -117,7 +117,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra else { targetPackage = null; } - LinkedHashMap conflicts = + MultiMap conflicts = PullUpConflictsUtil.checkConflicts(infos, mySubclass, null, targetPackage, targetDirectory, dialog.getContainmentVerifier()); if (!conflicts.isEmpty()) { ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java index aceefe6cbf84..acd1171d9908 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -97,18 +98,18 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { @Override protected boolean preprocessUsages(final Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); final Project project = sourceClass.getProject(); final GlobalSearchScope scope = GlobalSearchScope.allScope(project); final PsiClass existingClass = JavaPsiFacade.getInstance(project).findClass(StringUtil.getQualifiedName(newPackageName, newClassName), scope); if (existingClass != null) { - conflicts.put(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + + conflicts.putValue(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + RefactorJBundle.message("there.already.exists.a.class.with.the.chosen.name")); } if (!myGenerateAccessors) { - conflicts.putAll(calculateInitializersConflicts()); + calculateInitializersConflicts(conflicts); final NecessaryAccessorsVisitor visitor = new NecessaryAccessorsVisitor(); for (PsiField field : fields) { field.accept(visitor); @@ -122,38 +123,36 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { final Set fieldsNeedingGetter = visitor.getFieldsNeedingGetter(); for (PsiField field : fieldsNeedingGetter) { - conflicts.put(field, "Field \'" + field.getName() + "\' needs getter"); + conflicts.putValue(field, "Field \'" + field.getName() + "\' needs getter"); } final Set fieldsNeedingSetter = visitor.getFieldsNeedingSetter(); for (PsiField field : fieldsNeedingSetter) { - conflicts.put(field, "Field \'" + field.getName() + "\' needs getter"); + conflicts.putValue(field, "Field \'" + field.getName() + "\' needs getter"); } } return showConflicts(conflicts); } @Override - protected boolean showConflicts(final Map conflicts) { + protected boolean showConflicts(final MultiMap conflicts) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { throw new RuntimeException(StringUtil.join(conflicts.values(), "\n")); } return super.showConflicts(conflicts); } - private Map calculateInitializersConflicts() { - final Map out = new HashMap(); + private void calculateInitializersConflicts(MultiMap conflicts) { final PsiClassInitializer[] initializers = sourceClass.getInitializers(); for (PsiClassInitializer initializer : initializers) { if (initializerDependsOnMoved(initializer)) { - out.put(initializer, "Class initializer requires moved members"); + conflicts.putValue(initializer, "Class initializer requires moved members"); } } for (PsiMethod constructor : sourceClass.getConstructors()) { if (initializerDependsOnMoved(constructor.getBody())) { - out.put(constructor, "Constructor requires moved members"); + conflicts.putValue(constructor, "Constructor requires moved members"); } } - return out; } private boolean initializerDependsOnMoved(PsiElement initializer) { diff --git a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java index 1316df548f09..0517518938cf 100644 --- a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java @@ -18,7 +18,10 @@ import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.inheritanceToDelegation.usageInfo.*; import com.intellij.refactoring.ui.ConflictsDialog; -import com.intellij.refactoring.util.*; +import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.refactoring.util.ConflictsUtil; +import com.intellij.refactoring.util.RefactoringUIUtil; +import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.classMembers.ClassMemberReferencesVisitor; import com.intellij.refactoring.util.classRefs.ClassInstanceScanner; import com.intellij.refactoring.util.classRefs.ClassReferenceScanner; @@ -33,6 +36,7 @@ import com.intellij.usages.UsageViewPresentation; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -172,12 +176,12 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { addAll(oldUsages, usagesIn); final ObjectUpcastedUsageInfo[] objectUpcastedUsageInfos = objectUpcastedUsages(usagesIn); if (myPrepareSuccessfulSwingThreadCallback != null) { - Map conflicts = new LinkedHashMap(); + MultiMap conflicts = new MultiMap(); if (objectUpcastedUsageInfos.length > 0) { final String message = RefactoringBundle.message("instances.of.0.upcasted.to.1.were.found", RefactoringUIUtil.getDescription(myClass, true), CommonRefactoringUtil.htmlEmphasize("java.lang.Object")); - conflicts.put(myClass, message); + conflicts.putValue(myClass, message); } analyzeConflicts(usagesIn, conflicts); @@ -202,7 +206,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { return true; } - private void analyzeConflicts(UsageInfo[] usage, Map conflicts) { + private void analyzeConflicts(UsageInfo[] usage, MultiMap conflicts) { HashMap> reportedNonDelegatedUsages = new HashMap>(); HashMap> reportedUpcasts = new HashMap>(); // HashSet reportedObjectUpcasts = new HashSet(); @@ -235,7 +239,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { if (container != null && !reportedContainers.contains(container)) { String message = RefactoringBundle.message("0.uses.1.of.an.instance.of.a.2", RefactoringUIUtil.getDescription(container, true), RefactoringUIUtil.getDescription(nonDelegatedMember, true), classDescription); - conflicts.put(container, CommonRefactoringUtil.capitalize(message)); + conflicts.putValue(container, CommonRefactoringUtil.capitalize(message)); reportedContainers.add(container); } } @@ -251,7 +255,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { String message = RefactoringBundle.message("0.upcasts.an.instance.of.1.to.2", RefactoringUIUtil.getDescription(container, true), classDescription, RefactoringUIUtil.getDescription(upcastedTo, false)); - conflicts.put(container, CommonRefactoringUtil.capitalize(message)); + conflicts.putValue(container, CommonRefactoringUtil.capitalize(message)); reportedContainers.add(container); } } @@ -262,7 +266,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { String message = RefactoringBundle.message("0.will.no.longer.override.1", RefactoringUIUtil.getDescription(info.getSubClassMethod(), true), RefactoringUIUtil.getDescription(info.getOverridenMethod(), true)); - conflicts.put(info.getSubClassMethod(), message); + conflicts.putValue(info.getSubClassMethod(), message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java index 6d23c89a8d55..b261a6fc8075 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java @@ -17,11 +17,10 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; /** * @author ven @@ -170,7 +169,7 @@ class InlineConstantFieldProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(Ref refUsages) { UsageInfo[] usagesIn = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); ReferencedElementsCollector collector = new ReferencedElementsCollector(); PsiExpression initializer = myField.getInitializer(); @@ -184,14 +183,14 @@ class InlineConstantFieldProcessor extends BaseRefactoringProcessor { if (element instanceof PsiExpression && isAccessedForWriting((PsiExpression)element)) { String message = RefactoringBundle.message("0.is.used.for.writing.in.1", RefactoringUIUtil.getDescription(myField, true), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(element), true)); - conflicts.put(element, message); + conflicts.putValue(element, message); } for (PsiMember member : referencedWithVisibility) { if (!resolveHelper.isAccessible(member, element, null)) { String message = RefactoringBundle.message("0.will.not.be.accessible.from.1.after.inlining", RefactoringUIUtil.getDescription(member, true), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(element), true)); - conflicts.put(member, message); + conflicts.putValue(member, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 24ba4b1b2f12..60b0b0dc4534 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -33,6 +33,7 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,7 +106,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(Ref refUsages) { UsageInfo[] usagesIn = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); if (!myInlineThisOnly) { final PsiMethod[] superMethods = myMethod.findSuperMethods(); @@ -113,7 +114,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { final String message = method.hasModifierProperty(PsiModifier.ABSTRACT) ? RefactoringBundle .message("inlined.method.implements.method.from.0", method.getContainingClass().getQualifiedName()) : RefactoringBundle .message("inlined.method.overrides.method.from.0", method.getContainingClass().getQualifiedName()); - conflicts.put(method, message); + conflicts.putValue(method, message); } } @@ -139,7 +140,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { public static void addInaccessibleMemberConflicts(final PsiElement element, final UsageInfo[] usages, final ReferencedElementsCollector collector, - final Map conflicts) { + final MultiMap conflicts) { element.accept(collector); final Map> containersToReferenced = getInaccessible(collector.myReferencedMembers, usages); @@ -151,7 +152,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { final String containerDescription = RefactoringUIUtil.getDescription(container, true); String message = RefactoringBundle.message("0.that.is.used.in.inlined.method.is.not.accessible.from.call.site.s.in.1", referencedDescription, containerDescription); - conflicts.put(container, CommonRefactoringUtil.capitalize(message)); + conflicts.putValue(container, CommonRefactoringUtil.capitalize(message)); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassProcessor.java index 8b11d25edd0b..9d3ce7cde1ab 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassProcessor.java @@ -19,6 +19,7 @@ import com.intellij.refactoring.util.TextOccurrencesUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,15 +125,15 @@ public class InlineToAnonymousClassProcessor extends BaseRefactoringProcessor { CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("inline.to.anonymous.refactoring"), s, null, myClass.getProject()); return false; } - Map conflicts = getConflicts(usages); + MultiMap conflicts = getConflicts(usages); if (!conflicts.isEmpty()) { return showConflicts(conflicts); } return super.preprocessUsages(refUsages); } - public Map getConflicts(final UsageInfo[] usages) { - Map result = new LinkedHashMap(); + public MultiMap getConflicts(final UsageInfo[] usages) { + MultiMap result = new MultiMap(); ReferencedElementsCollector collector = new ReferencedElementsCollector() { protected void checkAddMember(@NotNull final PsiMember member) { if (PsiTreeUtil.isAncestor(myClass, member, false)) { diff --git a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java index 0f942cc2962d..1e56b2f3a18e 100644 --- a/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java @@ -17,9 +17,9 @@ import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.inlineSuperClass.usageInfo.*; import com.intellij.refactoring.memberPushDown.PushDownConflicts; import com.intellij.refactoring.memberPushDown.PushDownProcessor; +import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.FixableUsageInfo; import com.intellij.refactoring.util.FixableUsagesRefactoringProcessor; -import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageInfo; @@ -27,6 +27,7 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -130,7 +131,7 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori @Override protected boolean preprocessUsages(final Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); final PushDownConflicts pushDownConflicts = new PushDownConflicts(mySuperClass, myMemberInfos); for (PsiClass targetClass : myTargetClasses) { for (MemberInfo info : myMemberInfos) { @@ -138,13 +139,15 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori pushDownConflicts.checkMemberPlacementInTargetClassConflict(targetClass, member); } } + for (PsiElement element : pushDownConflicts.getConflicts().keySet()) { + conflicts.put(element, pushDownConflicts.getConflicts().get(element)); + } checkConflicts(refUsages, conflicts); - conflicts.putAll(pushDownConflicts.getConflicts()); return showConflicts(conflicts); } @Override - protected boolean showConflicts(final Map conflicts) { + protected boolean showConflicts(final MultiMap conflicts) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { throw new RuntimeException(StringUtil.join(conflicts.values(), "\n")); } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterMethodUsagesProcessor.java index 77c498c04619..334209aa3c66 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterMethodUsagesProcessor.java @@ -4,6 +4,7 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import java.util.Map; @@ -17,7 +18,7 @@ public interface IntroduceParameterMethodUsagesProcessor { boolean isMethodUsage(UsageInfo usage); - Map findConflicts(IntroduceParameterData data, UsageInfo[] usages); + void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap conflicts); boolean processChangeMethodUsage(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java index b3d40ee65f34..2785ee70a189 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -33,14 +33,13 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import gnu.trove.TIntArrayList; import gnu.trove.TIntProcedure; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; import java.util.Set; public class IntroduceParameterProcessor extends BaseRefactoringProcessor implements IntroduceParameterData { @@ -193,13 +192,13 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem protected boolean preprocessUsages(Ref refUsages) { UsageInfo[] usagesIn = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); AnySameNameVariables anySameNameVariables = new AnySameNameVariables(); myMethodToReplaceIn.accept(anySameNameVariables); final Pair conflictPair = anySameNameVariables.getConflict(); if (conflictPair != null) { - conflicts.put(conflictPair.first, conflictPair.second); + conflicts.putValue(conflictPair.first, conflictPair.second); } if (!myGenerateDelegate) { @@ -213,7 +212,7 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem for (UsageInfo usageInfo : usagesIn) { if (!(usageInfo.getElement() instanceof PsiMethod) && !(usageInfo instanceof InternalUsageInfo)) { if (!PsiTreeUtil.isAncestor(myMethodToReplaceIn.getContainingClass(), usageInfo.getElement(), false)) { - conflicts.put(myParameterInitializer, RefactoringBundle.message("parameter.initializer.contains.0.but.not.all.calls.to.method.are.in.its.class", + conflicts.putValue(myParameterInitializer, RefactoringBundle.message("parameter.initializer.contains.0.but.not.all.calls.to.method.are.in.its.class", CommonRefactoringUtil.htmlEmphasize(PsiKeyword.SUPER))); break; } @@ -223,13 +222,13 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem } for (IntroduceParameterMethodUsagesProcessor processor : IntroduceParameterMethodUsagesProcessor.EP_NAME.getExtensions()) { - conflicts.putAll(processor.findConflicts(this, refUsages.get())); + processor.findConflicts(this, refUsages.get(), conflicts); } return showConflicts(conflicts); } - private void detectAccessibilityConflicts(final UsageInfo[] usageArray, Map conflicts) { + private void detectAccessibilityConflicts(final UsageInfo[] usageArray, MultiMap conflicts) { if (myParameterInitializer != null) { final ReferencedElementsCollector collector = new ReferencedElementsCollector(); myParameterInitializer.accept(collector); @@ -246,7 +245,7 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem "0.is.not.accesible.from.1.value.for.introduced.parameter.in.that.method.call.will.be.incorrect", RefactoringUIUtil.getDescription(element, true), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(place), true)); - conflicts.put(element, message); + conflicts.putValue(element, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java index f05d975add23..b131ba44a0bb 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java @@ -17,13 +17,11 @@ import com.intellij.refactoring.util.usageInfo.DefaultConstructorImplicitUsageIn import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.MultiMap; import gnu.trove.TIntArrayList; import gnu.trove.TIntProcedure; import org.jetbrains.annotations.Nullable; -import java.util.Collections; -import java.util.Map; - /** * @author Maxim.Medvedev */ @@ -123,8 +121,7 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar } - public Map findConflicts(IntroduceParameterData data, UsageInfo[] usages) { - return Collections.emptyMap(); + public void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap conflicts) { } public boolean processChangeMethodSignature(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java index c2c0493ebbb7..dfd6b37db116 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java @@ -10,9 +10,7 @@ import com.intellij.refactoring.rename.JavaUnresolvableLocalCollisionDetector; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.refactoring.util.occurences.ExpressionOccurenceManager; import com.intellij.util.containers.HashSet; - -import java.util.LinkedHashMap; -import java.util.Map; +import com.intellij.util.containers.MultiMap; public class InputValidator implements IntroduceVariableBase.Validator { private final Project myProject; @@ -32,7 +30,7 @@ public class InputValidator implements IntroduceVariableBase.Validator { } final PsiElement scope = anchor.getParent(); if(scope == null) return true; - final Map conflicts = new LinkedHashMap(); + final MultiMap conflicts = new MultiMap(); final HashSet reportedVariables = new HashSet(); JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor visitor = new JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor() { public void visitCollidingElement(PsiVariable collidingVariable) { @@ -40,7 +38,7 @@ public class InputValidator implements IntroduceVariableBase.Validator { if (!reportedVariables.contains(collidingVariable)) { reportedVariables.add(collidingVariable); String message = RefactoringBundle.message("introduced.variable.will.conflict.with.0", RefactoringUIUtil.getDescription(collidingVariable, true)); - conflicts.put(collidingVariable, message); + conflicts.putValue(collidingVariable, message); } } }; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index b80981bf67d9..6d82127b440f 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -42,6 +42,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.occurences.ExpressionOccurenceManager; import com.intellij.refactoring.util.occurences.NotInSuperCallOccurenceFilter; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,7 +53,6 @@ import javax.swing.event.ListSelectionListener; import java.awt.*; import java.util.ArrayList; import java.util.List; -import java.util.Map; public abstract class IntroduceVariableBase extends IntroduceHandlerBase implements RefactoringActionHandler { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.introduceVariable.IntroduceVariableBase"); @@ -685,10 +685,10 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase impleme boolean isOK(IntroduceVariableSettings dialog); } - protected abstract boolean reportConflicts(Map conflicts, final Project project, IntroduceVariableSettings dialog); + protected abstract boolean reportConflicts(MultiMap conflicts, final Project project, IntroduceVariableSettings dialog); - public static void checkInLoopCondition(PsiExpression occurence, Map conflicts) { + public static void checkInLoopCondition(PsiExpression occurence, MultiMap conflicts) { final PsiElement loopForLoopCondition = RefactoringUtil.getLoopForLoopCondition(occurence); if (loopForLoopCondition == null) return; final List referencedVariables = RefactoringUtil.collectReferencedVariables(occurence); @@ -702,9 +702,9 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase impleme if (!modifiedInBody.isEmpty()) { for (PsiVariable variable : modifiedInBody) { final String message = RefactoringBundle.message("is.modified.in.loop.body", RefactoringUIUtil.getDescription(variable, false)); - conflicts.put(variable, CommonRefactoringUtil.capitalize(message)); + conflicts.putValue(variable, CommonRefactoringUtil.capitalize(message)); } - conflicts.put(occurence, RefactoringBundle.message("introducing.variable.may.break.code.logic")); + conflicts.putValue(occurence, RefactoringBundle.message("introducing.variable.may.break.code.logic")); } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java index 44a1e27086c4..f42c337d342a 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java @@ -17,9 +17,9 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.containers.MultiMap; import java.util.ArrayList; -import java.util.Map; public class IntroduceVariableHandler extends IntroduceVariableBase { @@ -72,7 +72,7 @@ public class IntroduceVariableHandler extends IntroduceVariableBase { WindowManager.getInstance().getStatusBar(project).setInfo(RefactoringBundle.message("press.escape.to.remove.the.highlighting")); } - protected boolean reportConflicts(final Map conflicts, final Project project, IntroduceVariableSettings dialog) { + protected boolean reportConflicts(final MultiMap conflicts, final Project project, IntroduceVariableSettings dialog) { ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts); conflictsDialog.show(); final boolean ok = conflictsDialog.isOK(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java index 06db53e55360..e088590c74be 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -102,23 +103,23 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP @Override protected boolean preprocessUsages(final Ref refUsages) { - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); if (myUseExistingClass) { if (existingClass == null) { - conflicts.put(null, RefactorJBundle.message("cannot.perform.the.refactoring") + "Could not find the selected class"); + conflicts.putValue(null, RefactorJBundle.message("cannot.perform.the.refactoring") + "Could not find the selected class"); } final String incompatibilityMessage = "Selected class is not compatible with chosen parameters"; if (!myExistingClassCompatible) { conflicts - .put(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + incompatibilityMessage); + .putValue(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + incompatibilityMessage); } if (!paramsNeedingSetters.isEmpty()) { - conflicts.put(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + incompatibilityMessage); + conflicts.putValue(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + incompatibilityMessage); } } else if (existingClass != null) { - conflicts.put(existingClass, + conflicts.putValue(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + RefactorJBundle.message("there.already.exists.a.class.with.the.chosen.name")); } @@ -126,7 +127,7 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP } @Override - protected boolean showConflicts(final Map conflicts) { + protected boolean showConflicts(final MultiMap conflicts) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { throw new RuntimeException(StringUtil.join(conflicts.values(), "\n")); } diff --git a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeClassStaticProcessor.java b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeClassStaticProcessor.java index 94a72ae8b510..dcfb15a8ca00 100644 --- a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeClassStaticProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeClassStaticProcessor.java @@ -17,11 +17,11 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * @author ven @@ -295,8 +295,8 @@ public class MakeClassStaticProcessor extends MakeMethodOrClassStaticProcessor

getConflictDescriptions(final UsageInfo[] usages) { - final Map conflicts = super.getConflictDescriptions(usages); + protected MultiMap getConflictDescriptions(final UsageInfo[] usages) { + final MultiMap conflicts = super.getConflictDescriptions(usages); //Check fields already exist if (mySettings.isMakeClassParameter()) { @@ -305,7 +305,7 @@ public class MakeClassStaticProcessor extends MakeMethodOrClassStaticProcessor

refUsages) { UsageInfo[] usagesIn = refUsages.get(); if (myPrepareSuccessfulSwingThreadCallback != null) { - Map conflicts = getConflictDescriptions(usagesIn); + MultiMap conflicts = getConflictDescriptions(usagesIn); if (conflicts.size() > 0) { ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); conflictsDialog.show(); @@ -93,8 +94,8 @@ public abstract class MakeMethodOrClassStaticProcessor getConflictDescriptions(UsageInfo[] usages) { - Map conflicts = new LinkedHashMap(); + protected MultiMap getConflictDescriptions(UsageInfo[] usages) { + MultiMap conflicts = new MultiMap(); HashSet processed = new HashSet(); String typeString = StringUtil.capitalize(UsageViewUtil.getType(myMember)); for (UsageInfo usageInfo : usages) { @@ -115,12 +116,12 @@ public abstract class MakeMethodOrClassStaticProcessor inaccessibleConflicts = createInaccessibleFieldsConflictDescription(inaccessible, container); - conflicts.putAll(inaccessibleConflicts); + createInaccessibleFieldsConflictDescription(inaccessible, container, conflicts); } } return conflicts; } - private static Map createInaccessibleFieldsConflictDescription(ArrayList inaccessible, PsiElement container) { + private static void createInaccessibleFieldsConflictDescription(ArrayList inaccessible, PsiElement container, + MultiMap conflicts) { if (inaccessible.size() == 1) { final PsiField field = inaccessible.get(0); - return Collections.singletonMap(field, RefactoringBundle.message("field.0.is.not.accessible", + conflicts.putValue(field, RefactoringBundle.message("field.0.is.not.accessible", CommonRefactoringUtil.htmlEmphasize(field.getName()), RefactoringUIUtil.getDescription(container, true))); } else { - Map result = new HashMap(); + for (int j = 0; j < inaccessible.size(); j++) { PsiField field = inaccessible.get(j); - result.put(field, RefactoringBundle.message("field.0.is.not.accessible", + conflicts.putValue(field, RefactoringBundle.message("field.0.is.not.accessible", CommonRefactoringUtil.htmlEmphasize(field.getName()), RefactoringUIUtil.getDescription(container, true))); } - - return result; } } diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java index 4f44eae2de7c..f5f53f15d072 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java @@ -33,11 +33,11 @@ import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.LinkedHashMap; public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog.Callback, ElementsHandler { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.memberPullUp.JavaPullUpHandler"); @@ -172,7 +172,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog final MemberInfo[] infos = dialog.getSelectedMemberInfos(); PsiClass superClass = dialog.getSuperClass(); if (!checkWritable(superClass, infos)) return false; - LinkedHashMap conflicts = PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, null, null, dialog.getContainmentVerifier()); + MultiMap conflicts = PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, null, null, dialog.getContainmentVerifier()); if (!conflicts.isEmpty()) { ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); conflictsDialog.show(); diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java index 209b30395658..d105ec6d1eb5 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java @@ -22,13 +22,14 @@ import com.intellij.refactoring.util.classMembers.ClassMemberReferencesVisitor; import com.intellij.refactoring.util.classMembers.InterfaceContainmentVerifier; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.MultiMap; import java.util.*; public class PullUpConflictsUtil { private PullUpConflictsUtil() {} - public static LinkedHashMap checkConflicts(final MemberInfo[] infos, + public static MultiMap checkConflicts(final MemberInfo[] infos, PsiClass subclass, PsiClass superClass, PsiPackage targetPackage, @@ -60,7 +61,7 @@ public class PullUpConflictsUtil { movedMembers.add(member); } } - final LinkedHashMap conflicts = new LinkedHashMap(); + final MultiMap conflicts = new MultiMap(); if (superClass != null) { checkSuperclassMembers(superClass, infos, conflicts); if (isInterfaceTarget) { @@ -89,7 +90,7 @@ public class PullUpConflictsUtil { return conflicts; } - private static void checkInterfaceTarget(MemberInfo[] infos, LinkedHashMap conflictsList) { + private static void checkInterfaceTarget(MemberInfo[] infos, MultiMap conflictsList) { for (MemberInfo info : infos) { PsiElement member = info.getMember(); @@ -100,21 +101,21 @@ public class PullUpConflictsUtil { String message = RefactoringBundle.message("0.is.not.static.it.cannot.be.moved.to.the.interface", RefactoringUIUtil.getDescription(member, false)); message = CommonRefactoringUtil.capitalize(message); - conflictsList.put(member, message); + conflictsList.putValue(member, message); } } if (member instanceof PsiField && ((PsiField)member).getInitializer() == null) { String message = RefactoringBundle.message("0.is.not.initialized.in.declaration.such.fields.are.not.allowed.in.interfaces", RefactoringUIUtil.getDescription(member, false)); - conflictsList.put(member, CommonRefactoringUtil.capitalize(message)); + conflictsList.putValue(member, CommonRefactoringUtil.capitalize(message)); } } } private static void checkSuperclassMembers(PsiClass superClass, MemberInfo[] infos, - LinkedHashMap conflictsList) { + MultiMap conflictsList) { for (MemberInfo info : infos) { PsiMember member = info.getMember(); boolean isConflict = false; @@ -135,7 +136,7 @@ public class PullUpConflictsUtil { RefactoringUIUtil.getDescription(superClass, false), RefactoringUIUtil.getDescription(member, false)); message = CommonRefactoringUtil.capitalize(message); - conflictsList.put(superClass, message); + conflictsList.putValue(superClass, message); } } @@ -148,13 +149,13 @@ public class PullUpConflictsUtil { private final PsiClass mySubclass; private final PsiClass mySuperClass; private final PsiPackage myTargetPackage; - private final LinkedHashMap myConflictsList; + private final MultiMap myConflictsList; private final InterfaceContainmentVerifier myInterfaceContainmentVerifier; ConflictingUsagesOfSubClassMembers(PsiElement scope, Set movedMembers, Set abstractMethods, PsiClass subclass, PsiClass superClass, - PsiPackage targetPackage, LinkedHashMap conflictsList, + PsiPackage targetPackage, MultiMap conflictsList, InterfaceContainmentVerifier interfaceContainmentVerifier) { super(subclass); myScope = scope; @@ -188,7 +189,7 @@ public class PullUpConflictsUtil { RefactoringUIUtil.getDescription(myScope, false), RefactoringUIUtil.getDescription(classMember, true)); message = CommonRefactoringUtil.capitalize(message); - myConflictsList.put(classMember, message); + myConflictsList.putValue(classMember, message); } return; @@ -199,7 +200,7 @@ public class PullUpConflictsUtil { RefactoringUIUtil.getDescription(myScope, false), RefactoringUIUtil.getDescription(classMember, true)); message = CommonRefactoringUtil.capitalize(message); - myConflictsList.put(classMember, message); + myConflictsList.putValue(classMember, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java index 6c6edd706eec..d4ec65f3d0bc 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java @@ -8,14 +8,16 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.refactoring.util.classMembers.ClassMemberReferencesVisitor; import com.intellij.refactoring.util.classMembers.MemberInfo; +import com.intellij.util.containers.MultiMap; -import java.util.*; +import java.util.HashSet; +import java.util.Set; public class PushDownConflicts { private final PsiClass myClass; private final Set myMovedMembers; private final Set myAbstractMembers; - private final Map myConflicts; + private final MultiMap myConflicts; public PushDownConflicts(PsiClass aClass, MemberInfo[] memberInfos) { @@ -33,14 +35,14 @@ public class PushDownConflicts { } } - myConflicts = new HashMap(); + myConflicts = new MultiMap(); } public boolean isAnyConflicts() { return !myConflicts.isEmpty(); } - public Map getConflicts() { + public MultiMap getConflicts() { return myConflicts; } @@ -69,7 +71,7 @@ public class PushDownConflicts { if (qualifierType instanceof PsiClassType) { final PsiClass aClass = ((PsiClassType)qualifierType).resolve(); if (!InheritanceUtil.isInheritorOrSelf(aClass, targetClass, true)) { - myConflicts.put(aClass, RefactoringBundle.message("pushed.members.will.not.be.visible.from.certain.call.sites")); + myConflicts.putValue(aClass, RefactoringBundle.message("pushed.members.will.not.be.visible.from.certain.call.sites")); break Members; } } @@ -85,7 +87,7 @@ public class PushDownConflicts { final PsiField field = targetClass.findFieldByName(name, false); if (field != null) { String message = RefactoringBundle.message("0.already.contains.field.1", RefactoringUIUtil.getDescription(targetClass, false), CommonRefactoringUtil.htmlEmphasize(name)); - myConflicts.put(field, CommonRefactoringUtil.capitalize(message)); + myConflicts.putValue(field, CommonRefactoringUtil.capitalize(message)); } } else if (movedMember instanceof PsiMethod) { @@ -97,7 +99,7 @@ public class PushDownConflicts { if (overrider != null) { String message = RefactoringBundle.message("0.is.already.overridden.in.1", RefactoringUIUtil.getDescription(method, true), RefactoringUIUtil.getDescription(targetClass, false)); - myConflicts.put(overrider, CommonRefactoringUtil.capitalize(message)); + myConflicts.putValue(overrider, CommonRefactoringUtil.capitalize(message)); } } } @@ -111,7 +113,7 @@ public class PushDownConflicts { if (name.equals(innerClass.getName())) { String message = RefactoringBundle.message("0.already.contains.inner.class.named.1", RefactoringUIUtil.getDescription(targetClass, false), CommonRefactoringUtil.htmlEmphasize(name)); - myConflicts.put(innerClass, message); + myConflicts.putValue(innerClass, message); } } } @@ -130,7 +132,7 @@ public class PushDownConflicts { String message = RefactoringBundle.message("0.uses.1.which.is.pushed.down", RefactoringUIUtil.getDescription(mySource, false), RefactoringUIUtil.getDescription(classMember, false)); message = CommonRefactoringUtil.capitalize(message); - myConflicts.put(mySource, message); + myConflicts.putValue(mySource, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java index a750fcfc019e..fe25b04c6e70 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java @@ -9,11 +9,11 @@ import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.Map; /** * @author dsl @@ -60,7 +60,7 @@ public class AutocreatingSingleSourceRootMoveDestination extends AutocreatingMov } public void analyzeModuleConflicts(final Collection elements, - Map conflicts, final UsageInfo[] usages) { + MultiMap conflicts, final UsageInfo[] usages) { RefactoringUtil.analyzeModuleConflicts(getTargetPackage().getManager().getProject(), elements, usages, mySourceRoot, conflicts); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java index 82eb2071befd..e94067adfdcc 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java @@ -18,15 +18,16 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.RefactoringBundle; -import com.intellij.refactoring.rename.RenameUtil; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveClassesOrPackagesCallback; +import com.intellij.refactoring.rename.RenameUtil; import com.intellij.refactoring.util.*; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -264,12 +265,12 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor { return result; } - public Map getConflicts(final UsageInfo[] usages) { - Map conflicts = new LinkedHashMap(); + public MultiMap getConflicts(final UsageInfo[] usages) { + MultiMap conflicts = new MultiMap(); final PsiClass innerClass = myTargetClass.findInnerClassByName(myClassToMove.getName(), false); if (innerClass != null) { - conflicts.put(innerClass, RefactoringBundle.message("move.to.inner.duplicate.inner.class", + conflicts.putValue(innerClass, RefactoringBundle.message("move.to.inner.duplicate.inner.class", CommonRefactoringUtil.htmlEmphasize(myTargetClass.getQualifiedName()), CommonRefactoringUtil.htmlEmphasize(myClassToMove.getName()))); } @@ -344,10 +345,10 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor { } private class ConflictsCollector { - private final Map myConflicts; + private final MultiMap myConflicts; private final Set myReportedContainers = new HashSet(); - public ConflictsCollector(final Map conflicts) { + public ConflictsCollector(final MultiMap conflicts) { myConflicts = conflicts; } @@ -362,7 +363,7 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor { final String message = RefactoringBundle.message("element.will.no.longer.be.accessible", targetDescription, RefactoringUIUtil.getDescription(container, true)); - myConflicts.put(targetElement, message); + myConflicts.putValue(targetElement, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index b549bb575611..19b261b24039 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -33,6 +33,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -120,7 +121,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { @NotNull protected UsageInfo[] findUsages() { List allUsages = new ArrayList(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); for (PsiElement element : myElementsToMove) { String newName = getNewQName(element); final UsageInfo[] usages = MoveClassesOrPackagesUtil.findUsages(element, mySearchInComments, @@ -148,14 +149,14 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } protected static class ConflictsUsageInfo extends UsageInfo { - private final Map myConflicts; + private final MultiMap myConflicts; - public ConflictsUsageInfo(PsiElement pseudoElement, Map conflicts) { + public ConflictsUsageInfo(PsiElement pseudoElement, MultiMap conflicts) { super(pseudoElement); myConflicts = conflicts; } - public Map getConflicts() { + public MultiMap getConflicts() { return myConflicts; } } @@ -164,11 +165,15 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { protected boolean preprocessUsages(Ref refUsages) { final UsageInfo[] usages = refUsages.get(); - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); ArrayList filteredUsages = new ArrayList(); for (UsageInfo usage : usages) { if (usage instanceof ConflictsUsageInfo) { - conflicts.putAll(((ConflictsUsageInfo)usage).getConflicts()); + final ConflictsUsageInfo info = (ConflictsUsageInfo)usage; + final PsiElement element = info.getElement(); + for (String conflict : info.getConflicts().values()) { + conflicts.putValue(element, conflict); + } } else { filteredUsages.add(usage); @@ -188,7 +193,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { return false; } - private void detectPackageLocalsUsed(final Map conflicts) { + private void detectPackageLocalsUsed(final MultiMap conflicts) { PackageLocalsUsageCollector visitor = new PackageLocalsUsageCollector(myElementsToMove, myTargetPackage, conflicts); for (PsiElement element : myElementsToMove) { @@ -199,7 +204,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } } - private void detectPackageLocalsMoved(final UsageInfo[] usages, final Map conflicts) { + private void detectPackageLocalsMoved(final UsageInfo[] usages, final MultiMap conflicts) { // final HashSet reportedPackageLocalUsed = new HashSet(); final HashSet movedClasses = new HashSet(); final HashMap> reportedClassToContainers = new HashMap>(); @@ -237,7 +242,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { CommonRefactoringUtil.htmlEmphasize(aClass.getName()), RefactoringUIUtil.getDescription( container, true)); - conflicts.put(aClass, message); + conflicts.putValue(aClass, message); } } } @@ -470,11 +475,11 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } private class MyClassInstanceReferenceVisitor implements ClassInstanceScanner.ClassInstanceReferenceVisitor { - private final Map myConflicts; + private final MultiMap myConflicts; private final HashMap> myReportedElementToContainer = new HashMap>(); private final HashMap myIsDescendantOfCache = new HashMap(); - public MyClassInstanceReferenceVisitor(Map conflicts) { + public MyClassInstanceReferenceVisitor(MultiMap conflicts) { myConflicts = conflicts; } @@ -538,7 +543,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { if (!myTargetPackage.equalToPackage(aPackage)) { String message = RefactoringBundle.message("0.will.be.inaccessible.from.1", RefactoringUIUtil.getDescription(member, true), RefactoringUIUtil.getDescription(container, true)); - myConflicts.put(member, CommonRefactoringUtil.capitalize(message)); + myConflicts.putValue(member, CommonRefactoringUtil.capitalize(message)); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java index 0ce688911ee5..28c058ef2980 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java @@ -7,10 +7,10 @@ import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.Map; /** * @author dsl @@ -77,7 +77,7 @@ public class MultipleRootsMoveDestination extends AutocreatingMoveDestination { } public void analyzeModuleConflicts(final Collection elements, - Map conflicts, final UsageInfo[] usages) { + MultiMap conflicts, final UsageInfo[] usages) { } public PsiDirectory getTargetIfExists(PsiDirectory source) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java index f99de8d920dc..a37ea763cc8b 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/PackageLocalsUsageCollector.java @@ -9,17 +9,17 @@ import com.intellij.refactoring.util.ConflictsUtil; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import java.util.HashSet; -import java.util.Map; class PackageLocalsUsageCollector extends JavaRecursiveElementWalkingVisitor { private final HashMap> myReported = new HashMap>(); private final PsiElement[] myElementsToMove; - private final Map myConflicts; + private final MultiMap myConflicts; private final PackageWrapper myTargetPackage; - public PackageLocalsUsageCollector(final PsiElement[] elementsToMove, final PackageWrapper targetPackage, Map conflicts) { + public PackageLocalsUsageCollector(final PsiElement[] elementsToMove, final PackageWrapper targetPackage, MultiMap conflicts) { myElementsToMove = elementsToMove; myConflicts = conflicts; myTargetPackage = targetPackage; @@ -56,7 +56,7 @@ class PackageLocalsUsageCollector extends JavaRecursiveElementWalkingVisitor { final String message = RefactoringBundle.message("0.uses.a.package.local.1", RefactoringUIUtil.getDescription(container, true), RefactoringUIUtil.getDescription(resolved, true)); - myConflicts.put(resolved, CommonRefactoringUtil.capitalize(message)); + myConflicts.putValue(resolved, CommonRefactoringUtil.capitalize(message)); reportedRefs.add(container); } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/SingleSourceRootMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/SingleSourceRootMoveDestination.java index 0cb10e960173..4306a3f9fcd8 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/SingleSourceRootMoveDestination.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/SingleSourceRootMoveDestination.java @@ -6,9 +6,9 @@ import com.intellij.refactoring.MoveDestination; import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.MultiMap; import java.util.Collection; -import java.util.Map; /** * @author dsl @@ -54,7 +54,7 @@ public class SingleSourceRootMoveDestination implements MoveDestination { } public void analyzeModuleConflicts(final Collection elements, - Map conflicts, final UsageInfo[] usages) { + MultiMap conflicts, final UsageInfo[] usages) { RefactoringUtil.analyzeModuleConflicts(myPackage.getManager().getProject(), elements, usages, myTargetDirectory, conflicts); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java index 8a411847863e..1962b9780dd3 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java @@ -37,11 +37,15 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; public class MoveInnerProcessor extends BaseRefactoringProcessor { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveInner.MoveInnerProcessor"); @@ -326,7 +330,7 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { } protected boolean preprocessUsages(Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); class Visitor extends JavaRecursiveElementWalkingVisitor { private final HashMap> reported = new HashMap>(); @@ -347,7 +351,7 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { String message = RefactoringBundle.message("0.will.become.inaccessible.from.1", RefactoringUIUtil.getDescription(resolved, true), RefactoringUIUtil.getDescription(container, true)); - conflicts.put(resolved, message); + conflicts.putValue(resolved, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java index 25451fbab762..b084bff35c3b 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java @@ -15,12 +15,16 @@ import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveInstanceMembersUtil; import com.intellij.refactoring.move.moveMembers.MoveMembersProcessor; -import com.intellij.refactoring.util.*; +import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.refactoring.util.ConflictsUtil; +import com.intellij.refactoring.util.RefactoringUIUtil; +import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -69,18 +73,18 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ protected boolean preprocessUsages(Ref refUsages) { final UsageInfo[] usages = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); final Set members = new HashSet(); members.add(myMethod); if (myTargetVariable instanceof PsiField) members.add((PsiMember)myTargetVariable); if (!myTargetClass.isInterface()) { - conflicts.putAll(MoveMembersProcessor.analyzeAccessibilityConflicts(members, myTargetClass, new LinkedHashMap(), myNewVisibility)); + MoveMembersProcessor.analyzeAccessibilityConflicts(members, myTargetClass, conflicts, myNewVisibility); } else { for (final UsageInfo usage : usages) { if (usage instanceof InheritorUsageInfo) { - conflicts.putAll(MoveMembersProcessor.analyzeAccessibilityConflicts( - members, ((InheritorUsageInfo)usage).getInheritor(), new LinkedHashMap(), myNewVisibility)); + MoveMembersProcessor.analyzeAccessibilityConflicts( + members, ((InheritorUsageInfo)usage).getInheritor(), conflicts, myNewVisibility); } } } @@ -99,7 +103,7 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ String message = RefactoringBundle.message("0.contains.call.with.null.argument.for.parameter.1", RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(methodCall), true), CommonRefactoringUtil.htmlEmphasize(parameter.getName())); - conflicts.put(instanceValue, message); + conflicts.putValue(instanceValue, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java index 6030e8090c10..40dcb89357db 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java @@ -23,7 +23,6 @@ import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveHandler; import com.intellij.refactoring.move.MoveMemberViewDescriptor; -import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.*; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; @@ -31,6 +30,7 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -224,7 +224,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { } protected boolean preprocessUsages(Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); final UsageInfo[] usages = refUsages.get(); try { addInaccessiblleConflicts(conflicts, usages); @@ -232,12 +232,12 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { catch (IncorrectOperationException e) { LOG.error(e); } - conflicts.putAll(analyzeMoveConflicts(myMembersToMove, myTargetClass, myNewVisibility)); + analyzeMoveConflicts(myMembersToMove, myTargetClass, myNewVisibility, conflicts); RefactoringUtil.analyzeModuleConflicts(myProject, myMembersToMove, usages, myTargetClass, conflicts); return showConflicts(conflicts); } - private void addInaccessiblleConflicts(final Map conflicts, final UsageInfo[] usages) throws IncorrectOperationException { + private void addInaccessiblleConflicts(final MultiMap conflicts, final UsageInfo[] usages) throws IncorrectOperationException { String newVisibility = myNewVisibility; if (VisibilityUtil.ESCALATE_VISIBILITY.equals(newVisibility)) { //Still need to check for access object newVisibility = PsiModifier.PUBLIC; @@ -271,7 +271,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { String message = CommonRefactoringUtil.capitalize(RefactoringBundle.message("0.with.1.visibility.is.not.accesible.from.2", RefactoringUIUtil.getDescription(member, false), newVisibility, RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(element), true))); - conflicts.put(member, message); + conflicts.putValue(member, message); } } @@ -280,7 +280,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { if (accessDetector != null) { final ReadWriteAccessDetector.Access access = accessDetector.getExpressionAccess(element); if (access != ReadWriteAccessDetector.Access.Read) { - conflicts.put(element, CommonRefactoringUtil.capitalize(RefactoringUIUtil.getDescription(member, true)) + " has write access but is moved to an interface"); + conflicts.putValue(element, CommonRefactoringUtil.capitalize(RefactoringUIUtil.getDescription(member, true)) + " has write access but is moved to an interface"); } } } @@ -298,25 +298,15 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { super.doRun(); } - private boolean canRefactor() { - final Map conflicts = analyzeMoveConflicts(myMembersToMove, myTargetClass, myNewVisibility); - if (!conflicts.isEmpty()) { - ConflictsDialog dialog = new ConflictsDialog(myProject, conflicts); - dialog.show(); - return dialog.isOK(); - } - return true; - } - - private static Map analyzeMoveConflicts(@NotNull Set membersToMove, final PsiClass targetClass, final String newVisibility) { - final LinkedHashMap conflicts = new LinkedHashMap(); + private static void analyzeMoveConflicts(@NotNull Set membersToMove, final PsiClass targetClass, final String newVisibility, + MultiMap conflicts) { for (final PsiMember member : membersToMove) { if (member instanceof PsiMethod) { PsiMethod method = (PsiMethod)member; if (hasMethod(targetClass, method)) { String message = RefactoringBundle.message("0.already.exists.in.the.target.class", RefactoringUIUtil.getDescription(method, false)); message = CommonRefactoringUtil.capitalize(message); - conflicts.put(method, message); + conflicts.putValue(method, message); } } else if (member instanceof PsiField) { @@ -324,16 +314,16 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { if (hasField(targetClass, field)) { String message = RefactoringBundle.message("0.already.exists.in.the.target.class", RefactoringUIUtil.getDescription(field, false)); message = CommonRefactoringUtil.capitalize(message); - conflicts.put(field, message); + conflicts.putValue(field, message); } } } - return analyzeAccessibilityConflicts(membersToMove, targetClass, conflicts, newVisibility); + analyzeAccessibilityConflicts(membersToMove, targetClass, conflicts, newVisibility); } - public static Map analyzeAccessibilityConflicts(@NotNull Set membersToMove, + public static void analyzeAccessibilityConflicts(@NotNull Set membersToMove, final PsiClass targetClass, - final LinkedHashMap conflicts, String newVisibility) { + final MultiMap conflicts, String newVisibility) { if (VisibilityUtil.ESCALATE_VISIBILITY.equals(newVisibility)) { //Still need to check for access object newVisibility = PsiModifier.PUBLIC; } @@ -363,7 +353,7 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { VisibilityUtil.getVisibilityStringToDisplay(targetClass), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(ref), true)); message = CommonRefactoringUtil.capitalize(message); - conflicts.put(targetClass, message); + conflicts.putValue(targetClass, message); } //check for member accessibility else if (!manager.getResolveHelper().isAccessible(member, modifierList, ref, null, null)) { @@ -372,15 +362,14 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { VisibilityUtil.getVisibilityStringToDisplay(member), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(ref), true)); message = CommonRefactoringUtil.capitalize(message); - conflicts.put(member, message); + conflicts.putValue(member, message); } } } } - return conflicts; } - private static void checkUsedElements(PsiMember member, PsiElement scope, @NotNull Set membersToMove, PsiClass newContext, LinkedHashMap conflicts) { + private static void checkUsedElements(PsiMember member, PsiElement scope, @NotNull Set membersToMove, PsiClass newContext, MultiMap conflicts) { if(scope instanceof PsiReferenceExpression) { PsiReferenceExpression refExpr = (PsiReferenceExpression)scope; PsiElement refElement = refExpr.resolve(); @@ -430,14 +419,14 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor { PsiClass newContext, PsiClass accessClass, PsiMember member, - LinkedHashMap conflicts) { + MultiMap conflicts) { if (!PsiUtil.isAccessible(refMember, newContext, accessClass)) { String message = RefactoringBundle.message("0.is.1.and.will.not.be.accessible.from.2.in.the.target.class", RefactoringUIUtil.getDescription(refMember, true), VisibilityUtil.getVisibilityStringToDisplay(refMember), RefactoringUIUtil.getDescription(member, false)); message = CommonRefactoringUtil.capitalize(message); - conflicts.put(refMember, message); + conflicts.putValue(refMember, message); } } diff --git a/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java b/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java index e37263ceaced..3346bcfb5ea9 100644 --- a/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java @@ -16,11 +16,10 @@ import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class RemoveMiddlemanProcessor extends FixableUsagesRefactoringProcessor { private static final Logger LOG = Logger.getInstance("#" + RemoveMiddlemanProcessor.class.getName()); @@ -61,12 +60,12 @@ public class RemoveMiddlemanProcessor extends FixableUsagesRefactoringProcessor @Override protected boolean preprocessUsages(final Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); for (MemberInfo memberInfo : myDelegateMethodInfos) { if (memberInfo.isChecked() && memberInfo.isToAbstract()) { final PsiMember psiMember = memberInfo.getMember(); if (psiMember instanceof PsiMethod && ((PsiMethod)psiMember).findDeepestSuperMethods().length > 0) { - conflicts.put(psiMember, SymbolPresentationUtil.getSymbolPresentableText(psiMember) + " will be deleted. Hierarchy will be broken"); + conflicts.putValue(psiMember, SymbolPresentationUtil.getSymbolPresentableText(psiMember) + " will be deleted. Hierarchy will be broken"); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java index e1acd2165546..2e61c6e6aa43 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java @@ -19,6 +19,7 @@ import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -187,7 +188,7 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { return WHITE_SPACE_PATTERN.matcher(s).replaceAll(""); } - public void findExistingNameConflicts(final PsiElement element, final String newName, final Map conflicts) { + public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap conflicts) { if (element instanceof PsiCompiledElement) return; final PsiClass aClass = (PsiClass)element; if (newName.equals(aClass.getName())) return; @@ -196,7 +197,7 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { PsiClass[] innerClasses = containingClass.getInnerClasses(); for (PsiClass innerClass : innerClasses) { if (newName.equals(innerClass.getName())) { - conflicts.put(innerClass, RefactoringBundle.message("inner.class.0.is.already.defined.in.class.1", newName, containingClass.getQualifiedName())); + conflicts.putValue(innerClass, RefactoringBundle.message("inner.class.0.is.already.defined.in.class.1", newName, containingClass.getQualifiedName())); break; } } @@ -207,7 +208,7 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { final PsiClass conflictingClass = JavaPsiFacade.getInstance(project).findClass(qualifiedNameAfterRename, GlobalSearchScope.allScope(project)); if (conflictingClass != null) { - conflicts.put(conflictingClass, RefactoringBundle.message("class.0.already.exists", qualifiedNameAfterRename)); + conflicts.putValue(conflictingClass, RefactoringBundle.message("class.0.already.exists", qualifiedNameAfterRename)); } } } 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 add7e50def29..161d968d9652 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -23,6 +23,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -132,7 +133,7 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor { findMemberHidesOuterMemberCollisions((PsiMethod) element, newName, result); } - public void findExistingNameConflicts(final PsiElement element, final String newName, final Map conflicts) { + public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap conflicts) { if (element instanceof PsiCompiledElement) return; PsiMethod refactoredMethod = (PsiMethod)element; if (newName.equals(refactoredMethod.getName())) return; diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiPackageProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiPackageProcessor.java index bf1c74eda003..d9cc32692219 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiPackageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiPackageProcessor.java @@ -9,6 +9,7 @@ import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; @@ -48,13 +49,13 @@ public class RenamePsiPackageProcessor extends RenamePsiElementProcessor { } @Override - public void findExistingNameConflicts(PsiElement element, String newName, Map conflicts) { + public void findExistingNameConflicts(PsiElement element, String newName, MultiMap conflicts) { final PsiPackage aPackage = (PsiPackage)element; final Project project = element.getProject(); final String qualifiedNameAfterRename = getPackageQualifiedNameAfterRename(aPackage, newName, true); final PsiClass psiClass = JavaPsiFacade.getInstance(project).findClass(qualifiedNameAfterRename, GlobalSearchScope.allScope(project)); if (psiClass != null) { - conflicts.put(psiClass, "Class with qualified name \'" + qualifiedNameAfterRename + "\' already exist"); + conflicts.putValue(psiClass, "Class with qualified name \'" + qualifiedNameAfterRename + "\' already exist"); } } diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java index 621d0c7f0379..8ca48e256e99 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java @@ -28,10 +28,10 @@ import com.intellij.refactoring.util.FixableUsagesRefactoringProcessor; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -251,7 +251,7 @@ public class ReplaceConstructorWithBuilderProcessor extends FixableUsagesRefacto } @Override - protected boolean showConflicts(Map conflicts) { + protected boolean showConflicts(MultiMap conflicts) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { throw new RuntimeException(StringUtil.join(conflicts.values(), "\n")); } @@ -260,21 +260,21 @@ public class ReplaceConstructorWithBuilderProcessor extends FixableUsagesRefacto @Override protected boolean preprocessUsages(Ref refUsages) { - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject); final PsiClass builderClass = psiFacade.findClass(StringUtil.getQualifiedName(myPackageName, myClassName), GlobalSearchScope.projectScope(myProject)); if (builderClass == null) { if (!myCreateNewBuilderClass) { - conflicts.put(null, "Selected class was not found."); + conflicts.putValue(null, "Selected class was not found."); } } else if (myCreateNewBuilderClass){ - conflicts.put(builderClass, "Class with chosen name already exist."); + conflicts.putValue(builderClass, "Class with chosen name already exist."); } final PsiMethod commonConstructor = getMostCommonConstructor(); if (commonConstructor == null) { - conflicts.put(null, "Found constructors are not reducible to simple chain"); + conflicts.putValue(null, "Found constructors are not reducible to simple chain"); } return showConflicts(conflicts); diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithFactory/ReplaceConstructorWithFactoryProcessor.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithFactory/ReplaceConstructorWithFactoryProcessor.java index aee74b58d1e5..0f3bc8970a55 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithFactory/ReplaceConstructorWithFactoryProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithFactory/ReplaceConstructorWithFactoryProcessor.java @@ -13,11 +13,12 @@ import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.ConflictsUtil; import com.intellij.refactoring.util.RefactoringUIUtil; -import com.intellij.util.VisibilityUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -114,14 +115,14 @@ public class ReplaceConstructorWithFactoryProcessor extends BaseRefactoringProce protected boolean preprocessUsages(Ref refUsages) { UsageInfo[] usages = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); final PsiResolveHelper helper = JavaPsiFacade.getInstance(myProject).getResolveHelper(); final PsiClass constructorContainingClass = getConstructorContainingClass(); if (!helper.isAccessible(constructorContainingClass, myTargetClass, null)) { String message = RefactoringBundle.message("class.0.is.not.accessible.from.target.1", RefactoringUIUtil.getDescription(constructorContainingClass, true), RefactoringUIUtil.getDescription(myTargetClass, true)); - conflicts.put(constructorContainingClass, message); + conflicts.putValue(constructorContainingClass, message); } HashSet reportedContainers = new HashSet(); @@ -134,7 +135,7 @@ public class ReplaceConstructorWithFactoryProcessor extends BaseRefactoringProce String message = RefactoringBundle.message("target.0.is.not.accessible.from.1", targetClassDescription, RefactoringUIUtil.getDescription(container, true)); - conflicts.put(myTargetClass, message); + conflicts.putValue(myTargetClass, message); } } } @@ -149,7 +150,7 @@ public class ReplaceConstructorWithFactoryProcessor extends BaseRefactoringProce String message = RefactoringBundle.message("constructor.being.refactored.is.used.in.initializer.of.0", RefactoringUIUtil.getDescription(field, true), RefactoringUIUtil.getDescription( constructorContainingClass, false)); - conflicts.put(field, message); + conflicts.putValue(field, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java index 06fb3a4fe390..1e2bd1767976 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java @@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.usageView.UsageViewUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -31,7 +32,7 @@ public class ConflictsUtil { public static void checkMethodConflicts(@Nullable PsiClass aClass, PsiMethod refactoredMethod, PsiMethod prototype, - final Map conflicts) { + final MultiMap conflicts) { if (prototype == null) return; PsiMethod method = aClass != null ? aClass.findMethodBySignature(prototype, true) : null; @@ -41,7 +42,7 @@ public class ConflictsUtil { final String classDescr = aClass instanceof PsiAnonymousClass ? RefactoringBundle.message("current.class") : RefactoringUIUtil.getDescription(aClass, false); - conflicts.put(method, RefactoringBundle.message("method.0.is.already.defined.in.the.1", + conflicts.putValue(method, RefactoringBundle.message("method.0.is.already.defined.in.the.1", getMethodPrototypeString(prototype), classDescr)); } @@ -55,10 +56,10 @@ public class ConflictsUtil { final String conflict = isMethodAbstract != isMyMethodAbstract ? RefactoringBundle.message("method.0.will.implement.method.of.the.base.class", protoMethodInfo, className) : RefactoringBundle.message("method.0.will.override.a.method.of.the.base.class", protoMethodInfo, className); - conflicts.put(method, conflict); + conflicts.putValue(method, conflict); } else { // prototype is private, will be compile-error - conflicts.put(method, RefactoringBundle.message("method.0.will.hide.method.of.the.base.class", + conflicts.putValue(method, RefactoringBundle.message("method.0.will.hide.method.of.the.base.class", protoMethodInfo, className)); } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/FixableUsagesRefactoringProcessor.java b/java/java-impl/src/com/intellij/refactoring/util/FixableUsagesRefactoringProcessor.java index 52ca2e53a468..6cb57bb6e426 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/FixableUsagesRefactoringProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/util/FixableUsagesRefactoringProcessor.java @@ -7,12 +7,12 @@ import com.intellij.psi.PsiElement; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.Map; public abstract class FixableUsagesRefactoringProcessor extends BaseRefactoringProcessor { private static final Logger LOG = Logger.getInstance("#" + FixableUsagesRefactoringProcessor.class.getName()); @@ -48,11 +48,11 @@ public abstract class FixableUsagesRefactoringProcessor extends BaseRefactoringP protected abstract void findUsages(@NotNull List usages); - protected static void checkConflicts(final Ref refUsages, final Map conflicts) { + protected static void checkConflicts(final Ref refUsages, final MultiMap conflicts) { for (UsageInfo info : refUsages.get()) { final String conflict = ((FixableUsageInfo)info).getConflictMessage(); if (conflict != null) { - conflicts.put(info.getElement(), XmlUtil.escape(conflict)); + conflicts.putValue(info.getElement(), XmlUtil.escape(conflict)); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 6e9a962f8a84..bec5c5a7fc71 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -47,6 +47,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -1092,7 +1093,7 @@ public class RefactoringUtil { Collection scope, final UsageInfo[] usages, PsiElement target, - final Map conflicts) { + final MultiMap conflicts) { if (scope == null) return; final VirtualFile vFile = PsiUtilBase.getVirtualFile(target); if (vFile == null) return; @@ -1103,7 +1104,7 @@ public class RefactoringUtil { final Collection scopes, final UsageInfo[] usages, final VirtualFile vFile, - final Map conflicts) { + final MultiMap conflicts) { if (scopes == null) return; for (final PsiElement scope : scopes) { @@ -1128,7 +1129,7 @@ public class RefactoringUtil { RefactoringUIUtil.getDescription(resolved, true)), scopeDescription, CommonRefactoringUtil.htmlEmphasize( targetModule.getName())); - conflicts.put(resolved, message); + conflicts.putValue(resolved, message); reported.add(resolved); } } @@ -1179,7 +1180,7 @@ public class RefactoringUtil { scopeDescription, CommonRefactoringUtil.htmlEmphasize(module.getName())); } - conflicts.put(referencedElement, message); + conflicts.putValue(referencedElement, message); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java index 13df51b53887..65fdbca63b5f 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java @@ -29,6 +29,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -137,11 +138,11 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor @Override protected boolean preprocessUsages(final Ref refUsages) { - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); final PsiClass existingClass = JavaPsiFacade.getInstance(myProject).findClass(myQualifiedName); if (myUseExistingClass) { if (existingClass == null) { - conflicts.put(existingClass, RefactorJBundle.message("could.not.find.selected.wrapping.class")); + conflicts.putValue(existingClass, RefactorJBundle.message("could.not.find.selected.wrapping.class")); } else { boolean foundConstructor = false; @@ -195,24 +196,24 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor } } if (!foundConstructor) { - conflicts.put(existingClass, "Existing class does not have appropriate constructor"); + conflicts.putValue(existingClass, "Existing class does not have appropriate constructor"); } } if (unwrapMethodName.length() == 0) { - conflicts.put(existingClass, + conflicts.putValue(existingClass, "Existing class does not have getter for selected field"); } } else { if (existingClass != null) { - conflicts.put(existingClass, RefactorJBundle.message("there.already.exists.a.class.with.the.selected.name")); + conflicts.putValue(existingClass, RefactorJBundle.message("there.already.exists.a.class.with.the.selected.name")); } } return showConflicts(conflicts); } @Override - protected boolean showConflicts(final Map conflicts) { + protected boolean showConflicts(final MultiMap conflicts) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { throw new RuntimeException(StringUtil.join(conflicts.values(), "\n")); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java index 799dc49d05b1..55042d916590 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java @@ -15,9 +15,9 @@ import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassToInnerProce import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.PsiTestUtil; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.MultiMap; import java.io.File; -import java.util.Map; /** * @author yole @@ -114,7 +114,7 @@ public class MoveClassToInnerTest extends CodeInsightTestCase { PsiClass targetClass = myJavaFacade.findClass(targetClassName, ProjectScope.getAllScope(myProject)); MoveClassToInnerProcessor processor = new MoveClassToInnerProcessor(myProject, classToMove, targetClass, true, true, null); UsageInfo[] usages = processor.findUsages(); - Map conflicts = processor.getConflicts(usages); + MultiMap conflicts = processor.getConflicts(usages); assertSameElements(conflicts.values() , expectedConflicts); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java index 12fed4fd23a9..c83b33c99492 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java @@ -1,5 +1,6 @@ package com.intellij.refactoring; +import com.intellij.JavaTestUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; @@ -9,11 +10,10 @@ import com.intellij.psi.PsiModifier; import com.intellij.psi.search.ProjectScope; import com.intellij.refactoring.move.moveMembers.MockMoveMembersOptions; import com.intellij.refactoring.move.moveMembers.MoveMembersProcessor; -import com.intellij.JavaTestUtil; +import com.intellij.util.containers.MultiMap; import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.Map; public class MoveMembersTest extends MultiFileTestCase { @Override @@ -137,7 +137,7 @@ public class MoveMembersTest extends MultiFileTestCase { options.setMemberVisibility(null); new MoveMembersProcessor(myProject, null, options){ @Override - protected boolean showConflicts(Map conflicts) { + protected boolean showConflicts(MultiMap conflicts) { if (!conflicts.isEmpty()) { throw new RuntimeException("Found conflicts: " + conflicts.values().iterator().next()); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java index 3c5e217d9311..e5713980265a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java @@ -11,10 +11,10 @@ import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.JavaTestUtil; +import com.intellij.util.containers.MultiMap; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class PushDownTest extends LightCodeInsightTestCase { @Override @@ -54,7 +54,7 @@ public class PushDownTest extends LightCodeInsightTestCase { new PushDownProcessor(getProject(), membersToMove.toArray(new MemberInfo[membersToMove.size()]), classes[0], new DocCommentPolicy(DocCommentPolicy.ASIS)){ @Override - protected boolean showConflicts(Map conflicts) { + protected boolean showConflicts(MultiMap conflicts) { if (failure ? conflicts.isEmpty() : !conflicts.isEmpty()) { fail(failure ? "Conflict was not detected" : "False conflict was detected"); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassMultifileTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassMultifileTest.java index 3d821857cc99..0ac1c8c4bfd9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassMultifileTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassMultifileTest.java @@ -12,9 +12,9 @@ import com.intellij.psi.search.ProjectScope; import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.PsiTestUtil; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.MultiMap; import java.io.File; -import java.util.Map; /** * @author yole @@ -46,7 +46,7 @@ public class InlineToAnonymousClassMultifileTest extends CodeInsightTestCase { classToInline, null, false, false, false); UsageInfo[] usages = processor.findUsages(); - Map conflicts = processor.getConflicts(usages); + MultiMap conflicts = processor.getConflicts(usages); assertEquals(0, conflicts.size()); processor.run(); diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java index 0134f4231dc2..e20c487b9ea4 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java @@ -9,10 +9,9 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; -import java.util.Map; - /** * @author yole */ @@ -321,7 +320,7 @@ public class InlineToAnonymousClassTest extends LightCodeInsightTestCase { public void testConflictInaccessibleOuterField() throws Exception { InlineToAnonymousClassProcessor processor = prepareProcessor(); UsageInfo[] usages = processor.findUsages(); - Map conflicts = processor.getConflicts(usages); + MultiMap conflicts = processor.getConflicts(usages); assertEquals(1, conflicts.size()); assertEquals("Field C2.a that is used in inlined method is not accessible from call site(s) in method C2User.test()", conflicts.values().iterator().next()); @@ -374,7 +373,7 @@ public class InlineToAnonymousClassTest extends LightCodeInsightTestCase { final InlineToAnonymousClassProcessor processor = new InlineToAnonymousClassProcessor(getProject(), classToInline, callToInline, inlineThisOnly, false, searchInNonJavaFiles); UsageInfo[] usages = processor.findUsages(); - Map conflicts = processor.getConflicts(usages); + MultiMap conflicts = processor.getConflicts(usages); assertEquals(0, conflicts.size()); processor.run(); } diff --git a/java/openapi/src/com/intellij/refactoring/MoveDestination.java b/java/openapi/src/com/intellij/refactoring/MoveDestination.java index 72943df86df0..bdc5a9ddc123 100644 --- a/java/openapi/src/com/intellij/refactoring/MoveDestination.java +++ b/java/openapi/src/com/intellij/refactoring/MoveDestination.java @@ -21,9 +21,11 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiPackage; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -60,5 +62,5 @@ public interface MoveDestination { @Nullable String verify(PsiPackage source); - void analyzeModuleConflicts(final Collection elements, Map conflicts, final UsageInfo[] usages); + void analyzeModuleConflicts(final Collection elements, MultiMap conflicts, final UsageInfo[] usages); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java index 1c9e51c46674..76061e0e476c 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java @@ -37,6 +37,7 @@ import com.intellij.usages.*; import com.intellij.usages.rules.PsiElementUsage; import com.intellij.util.Processor; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -446,7 +447,7 @@ public abstract class BaseRefactoringProcessor { performPsiSpoilingRefactoring(); } - protected boolean showConflicts(final Map conflicts) { + protected boolean showConflicts(final MultiMap conflicts) { if (!conflicts.isEmpty() && myPrepareSuccessfulSwingThreadCallback != null) { final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); conflictsDialog.show(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java b/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java index eae3464cadfc..9c31fee4da4b 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java @@ -18,6 +18,7 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import java.util.*; @@ -36,7 +37,7 @@ public class GenericInlineHandler { settings.isOnlyOneReferenceToInline() ? Collections.singleton(invocationReference) : ReferencesSearch.search(element).findAll(); final Map inliners = new HashMap(); - final Map conflicts = new HashMap(); + final MultiMap conflicts = new MultiMap(); for (PsiReference ref : allReferences) { final Language language = ref.getElement().getLanguage(); if (inliners.containsKey(language)) continue; @@ -51,7 +52,7 @@ public class GenericInlineHandler { } } if (inliner == null) { - conflicts.put(null, "Cannot inline reference from " + language.getID()); + conflicts.putValue(null, "Cannot inline reference from " + language.getID()); } } @@ -117,13 +118,15 @@ public class GenericInlineHandler { private static void collectConflicts(final PsiReference reference, final PsiElement element, final Map inliners, - final Map conflicts) { + final MultiMap conflicts) { final Language language = reference.getElement().getLanguage(); final InlineHandler.Inliner inliner = inliners.get(language); if (inliner != null) { final Map refConflicts = inliner.getConflicts(reference, element); if (refConflicts != null) { - conflicts.putAll(refConflicts); + for (PsiElement psiElement : refConflicts.keySet()) { + conflicts.putValue(psiElement, refConflicts.get(psiElement)); + } } } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java index dac2c9e0ef97..e6630c463868 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java @@ -24,6 +24,7 @@ import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -99,9 +100,9 @@ public class RenameProcessor extends BaseRefactoringProcessor { public boolean preprocessUsages(Ref refUsages) { UsageInfo[] usagesIn = refUsages.get(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); - conflicts.putAll(RenameUtil.getConflictDescriptions(usagesIn)); + RenameUtil.addConflictDescriptions(usagesIn, conflicts); RenamePsiElementProcessor.forElement(myPrimaryElement).findExistingNameConflicts(myPrimaryElement, myNewName, conflicts); if (!conflicts.isEmpty()) { ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenamePsiElementProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenamePsiElementProcessor.java index cdc9771b144e..663417cba697 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenamePsiElementProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenamePsiElementProcessor.java @@ -13,6 +13,7 @@ import com.intellij.refactoring.RefactoringSettings; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,7 +53,7 @@ public abstract class RenamePsiElementProcessor { public void prepareRenaming(final PsiElement element, final String newName, final Map allRenames) { } - public void findExistingNameConflicts(final PsiElement element, final String newName, final Map conflicts) { + public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap conflicts) { } @NotNull diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java index 9e7cc2b2e080..b17401c871bc 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java @@ -24,6 +24,7 @@ import com.intellij.refactoring.util.*; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -226,15 +227,12 @@ public class RenameUtil { } } - public static Map getConflictDescriptions(UsageInfo[] usages) { - Map descriptions = new HashMap(); - + public static void addConflictDescriptions(UsageInfo[] usages, MultiMap conflicts) { for (UsageInfo usage : usages) { if (usage instanceof UnresolvableCollisionUsageInfo) { - descriptions.put(usage.getElement(), ((UnresolvableCollisionUsageInfo)usage).getDescription()); + conflicts.putValue(usage.getElement(), ((UnresolvableCollisionUsageInfo)usage).getDescription()); } } - return descriptions; } public static void renameNonCodeUsages(@NotNull Project project, @NotNull NonCodeUsageInfo[] usages) { diff --git a/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java b/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java index e47df7c3eb37..539f0fdeb2d1 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java @@ -25,12 +25,14 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileEditorLocation; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.refactoring.RefactoringBundle; import com.intellij.ui.SimpleTextAttributes; import com.intellij.usageView.UsageInfo; import com.intellij.usages.*; import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,21 +40,27 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.util.ArrayList; import java.util.Collection; -import java.util.Map; +import java.util.List; import java.util.regex.Pattern; public class ConflictsDialog extends DialogWrapper{ private static final int SHOW_CONFLICTS_EXIT_CODE = 4; private String[] myConflictDescriptions; - private Map myElementConflictDescription; + private MultiMap myElementConflictDescription; private final Project myProject; - public ConflictsDialog(Project project, Map conflictDescriptions) { + public ConflictsDialog(Project project, MultiMap conflictDescriptions) { super(project, true); myProject = project; - myConflictDescriptions = ArrayUtil.toStringArray(conflictDescriptions.values()); + List conflicts = new ArrayList(); + + for (String conflict : conflictDescriptions.values()) { + conflicts.add(conflict); + } + myConflictDescriptions = conflicts.toArray(new String[conflicts.size()]); myElementConflictDescription = conflictDescriptions; setTitle(RefactoringBundle.message("problems.detected.title")); setOKButtonText(RefactoringBundle.message("continue.button")); @@ -174,7 +182,7 @@ public class ConflictsDialog extends DialogWrapper{ } private UsagePresentation getPresentation(final UsagePresentation usagePresentation, PsiElement element) { - final String conflictDescription = " (" + Pattern.compile("<[^<>]*>").matcher(myElementConflictDescription.get(element)).replaceAll("") + ")"; + final String conflictDescription = " (" + Pattern.compile("<[^<>]*>").matcher(StringUtil.join(myElementConflictDescription.get(element), "\n")).replaceAll("") + ")"; return new UsagePresentation() { @NotNull public TextChunk[] getText() { @@ -199,7 +207,7 @@ public class ConflictsDialog extends DialogWrapper{ } private class DescriptionOnlyUsage implements Usage { - private final String myConflictDescription = Pattern.compile("<[^<>]*>").matcher(myElementConflictDescription.get(null)).replaceAll(""); + private final String myConflictDescription = Pattern.compile("<[^<>]*>").matcher(StringUtil.join(myElementConflictDescription.get(null), "\n")).replaceAll(""); @NotNull public UsagePresentation getPresentation() { diff --git a/platform/platform-resources-en/src/messages/RefactoringBundle.properties b/platform/platform-resources-en/src/messages/RefactoringBundle.properties index 97fafdbdb98a..61adde5bb773 100644 --- a/platform/platform-resources-en/src/messages/RefactoringBundle.properties +++ b/platform/platform-resources-en/src/messages/RefactoringBundle.properties @@ -179,7 +179,7 @@ unknown.expression.type=Unknown expression type. invalid.expression.context=Invalid expression context. refactoring.is.not.supported.in.the.current.context={0} refactoring is not supported in the current context cannot.introduce.variable.in.super.constructor.call=Cannot introduce variable in super constructor call -is.modified.in.loop.body={0} is modified in loop body.\n +is.modified.in.loop.body={0} is modified in loop body. introducing.variable.may.break.code.logic=Introducing variable may break code logic. no.selection=No selection. selection.does.not.form.a.fragment.for.extraction=Selection does not form a fragment for extraction. diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index a65659aa9b86..05e254889fa5 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -945,7 +945,7 @@ public class StringUtil { return result.toString(); } - @NotNull public static String join(@NotNull Collection strings, @NotNull final String separator) { + @NotNull public static String join(@NotNull Collection strings, @NotNull final String separator) { final StringBuilder result = new StringBuilder(); for (String string : strings) { if (string != null && string.length() != 0) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java index a132911ac9ff..a577b2c18204 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java @@ -20,7 +20,7 @@ import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.hash.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,7 +48,6 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyValidationUtil; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; /** * @author ilyas @@ -106,7 +105,7 @@ public class ConvertParameterToMapEntryIntention extends Intention { @Override protected void doOKAction() { String name = getEnteredName(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); GroovyValidationUtil.validateNewParameterName(firstParam, conflicts, name); if (reportConflicts(conflicts, project)) { performRefactoring(element, owner, occurrences, createNewFirst(), name, specifyTypeExplicitly()); @@ -410,7 +409,7 @@ public class ConvertParameterToMapEntryIntention extends Intention { CodeStyleManager.getInstance(owner.getProject()).reformat(owner); } - private static boolean reportConflicts(final Map conflicts, final Project project) { + private static boolean reportConflicts(final MultiMap conflicts, final Project project) { if (conflicts.size() == 0) return true; ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts); conflictsDialog.show(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyValidationUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyValidationUtil.java index f18c8b32b90a..58160ccec9fc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyValidationUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyValidationUtil.java @@ -5,7 +5,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; @@ -14,14 +14,12 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; -import java.util.Map; - /** * @author ilyas */ public class GroovyValidationUtil { - public static boolean validateNewParameterName(GrParameter variable, Map conflicts, @NotNull String varName) { + public static boolean validateNewParameterName(GrParameter variable, MultiMap conflicts, @NotNull String varName) { GrParameterList list = PsiTreeUtil.getParentOfType(variable, GrParameterList.class); GrParametersOwner owner = PsiTreeUtil.getParentOfType(variable, GrParametersOwner.class); assert owner != null; @@ -37,7 +35,7 @@ public class GroovyValidationUtil { private static void validateVariableOccurrencesUp(PsiElement parent, PsiElement lastParent, - Map conflicts, + MultiMap conflicts, @NotNull String varName, final boolean containerIsFile) { if (!containerIsFile && (parent instanceof PsiFile) || parent == null) return; @@ -78,7 +76,7 @@ public class GroovyValidationUtil { private static void validateVariableOccurrencesDown(PsiElement parent, PsiElement startChild, - Map conflicts, + MultiMap conflicts, @NotNull String varName) { PsiElement child = parent.getLastChild(); while (child != null && child != startChild && !(child instanceof GrTypeDefinition)) { @@ -87,7 +85,7 @@ public class GroovyValidationUtil { } } - private static void validateVariableOccurrencesDownImpl(final PsiElement child, final Map conflicts, final String varName) { + private static void validateVariableOccurrencesDownImpl(final PsiElement child, final MultiMap conflicts, final String varName) { if (child instanceof PsiNamedElement) { PsiNamedElement element = (PsiNamedElement)child; if (varName.equals(element.getName())) { @@ -102,13 +100,13 @@ public class GroovyValidationUtil { } } - private static void addConflict(final String varName, final PsiNamedElement element, final Map conflicts) { + private static void addConflict(final String varName, final PsiNamedElement element, final MultiMap conflicts) { if (element instanceof GrParameter) { - conflicts.put(element, GroovyRefactoringBundle.message("variable.conflicts.with.parameter.0", CommonRefactoringUtil.htmlEmphasize(varName))); + conflicts.putValue(element, GroovyRefactoringBundle.message("variable.conflicts.with.parameter.0", CommonRefactoringUtil.htmlEmphasize(varName))); } else if (element instanceof GrField) { - conflicts.put(element, GroovyRefactoringBundle.message("variable.conflicts.with.field.0", CommonRefactoringUtil.htmlEmphasize(varName))); + conflicts.putValue(element, GroovyRefactoringBundle.message("variable.conflicts.with.field.0", CommonRefactoringUtil.htmlEmphasize(varName))); } else { - conflicts.put(element, GroovyRefactoringBundle.message("variable.conflicts.with.variable.0", CommonRefactoringUtil.htmlEmphasize(varName))); + conflicts.putValue(element, GroovyRefactoringBundle.message("variable.conflicts.with.variable.0", CommonRefactoringUtil.htmlEmphasize(varName))); } } @@ -124,11 +122,11 @@ public class GroovyValidationUtil { public String generateName() { String name = myName; int i = 1; - Map confl = new HashMap(); + MultiMap confl = new MultiMap(); while (!validateNewParameterName(myParameter, confl, name)) { name = myName + i; i++; - confl = new HashMap(); + confl = new MultiMap(); } return name; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineVariableUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineVariableUtil.java index 32eadb3648d1..22c02e5b9d7c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineVariableUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyInlineVariableUtil.java @@ -40,10 +40,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * @author ilyas diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java index e95c8aff9b75..56adc24f4490 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java @@ -56,10 +56,7 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.NameValidator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.HashMap; +import java.util.*; /** * @author ilyas diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduceParameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduceParameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java index 9073dc30bc8f..e4b6f68f4366 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduceParameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduceParameter/java2groovy/GroovyIntroduceParameterMethodUsagesProcessor.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper; import com.intellij.usageView.UsageInfo; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import gnu.trove.TIntArrayList; import gnu.trove.TIntProcedure; import org.jetbrains.annotations.Nullable; @@ -66,21 +67,19 @@ public class GroovyIntroduceParameterMethodUsagesProcessor implements IntroduceP return GroovyRefactoringUtil.isMethodUsage(usage.getElement()) && isGroovyUsage(usage); } - public Map findConflicts(IntroduceParameterData data, UsageInfo[] usages) { + public void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap conflicts) { Set groovyUsages = new HashSet(); for (UsageInfo usage : usages) { if (isMethodUsage(usage)) groovyUsages.add(usage); } - if (groovyUsages.size() == 0) return Collections.emptyMap(); - Map conflicts = new HashMap(); + if (groovyUsages.size() == 0) return; data.getParameterInitializer().accept(new InitializerVisitor(conflicts)); - return conflicts; } private static class InitializerVisitor extends JavaRecursiveElementWalkingVisitor { - private final Map conflicts; + private final MultiMap conflicts; - private InitializerVisitor(Map conflicts) { + private InitializerVisitor(MultiMap conflicts) { this.conflicts = conflicts; } @@ -89,11 +88,11 @@ public class GroovyIntroduceParameterMethodUsagesProcessor implements IntroduceP super.visitNewExpression(expression); final PsiExpression qualifier = expression.getQualifier(); if (qualifier != null) { - conflicts.put(qualifier, GroovyRefactoringBundle.message("groovy.does.not.support.inner.classes.but.it.is.used.in.parameter.initializer")); + conflicts.putValue(qualifier, GroovyRefactoringBundle.message("groovy.does.not.support.inner.classes.but.it.is.used.in.parameter.initializer")); } final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); if (anonymousClass != null) { - conflicts.put(anonymousClass, GroovyRefactoringBundle.message("groovy.does.not.support.anonymous.classes.but.it.is.used.in.parameter.initializer")); + conflicts.putValue(anonymousClass, GroovyRefactoringBundle.message("groovy.does.not.support.anonymous.classes.but.it.is.used.in.parameter.initializer")); } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptProcessor.java index acf42269da80..76e209162474 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptProcessor.java @@ -32,6 +32,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.refactoring.GroovyChangeContextUtil; @@ -55,7 +56,7 @@ public class MoveGroovyScriptProcessor extends MoveClassesOrPackagesProcessor { @Override protected UsageInfo[] findUsages() { List allUsages = new ArrayList(); - Map conflicts = new HashMap(); + MultiMap conflicts = new MultiMap(); final List elements = getElements(); for (PsiElement element : elements) { final GroovyFile groovyFile = (GroovyFile)element; @@ -77,7 +78,7 @@ public class MoveGroovyScriptProcessor extends MoveClassesOrPackagesProcessor { @Override protected boolean preprocessUsages(Ref refUsages) { - return showConflicts(Collections.emptyMap()); + return showConflicts(new MultiMap()); } @Override