multiple conflicts per element

This commit is contained in:
anna
2009-10-05 18:21:31 +04:00
parent c131b1495d
commit b893d8bf73
63 changed files with 327 additions and 311 deletions
@@ -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<PsiElement, String> conflicts) {
private void addMethodConflicts(MultiMap<PsiElement, String> conflicts) {
String newMethodName = myChangeInfo.newName;
try {
@@ -338,10 +339,10 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor {
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
Map<PsiElement, String> conflictDescriptions = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflictDescriptions = new MultiMap<PsiElement, String>();
UsageInfo[] usagesIn = refUsages.get();
addMethodConflicts(conflictDescriptions);
conflictDescriptions.putAll(RenameUtil.getConflictDescriptions(usagesIn));
RenameUtil.addConflictDescriptions(usagesIn, conflictDescriptions);
Set<UsageInfo> usagesSet = new HashSet<UsageInfo>(Arrays.asList(usagesIn));
RenameUtil.removeConflictUsages(usagesSet);
if (myChangeInfo.isVisibilityChanged) {
@@ -371,7 +372,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor {
return true;
}
private void addInaccessibilityDescriptions(Set<UsageInfo> usages, Map<PsiElement, String> conflictDescriptions) throws IncorrectOperationException {
private void addInaccessibilityDescriptions(Set<UsageInfo> usages, MultiMap<PsiElement, String> 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();
}
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final Set<PsiMember> methods = Collections.singleton((PsiMember)myMethod);
if (!myTargetClass.isInterface()) {
final String original = VisibilityUtil.getVisibilityModifier(myMethod.getModifierList());
conflicts.putAll(
MoveMembersProcessor.analyzeAccessibilityConflicts(methods, myTargetClass, new LinkedHashMap<PsiElement, String>(), 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<PsiElement, String>(),
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<PsiElement, String> conflicts) throws IncorrectOperationException {
private void addInaccessibilityConflicts(final UsageInfo[] usages, final MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts, boolean isGetter) {
private void checkExistingMethods(PsiMethod[] prototypes, MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts) {
protected void checkMethodConflicts(MultiMap<PsiElement, String> conflicts) {
PsiMethod prototype;
try {
PsiElementFactory factory = JavaPsiFacade.getInstance(myProject).getElementFactory();
@@ -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<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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) {
@@ -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<PsiElement,String> conflicts =
MultiMap<PsiElement,String> conflicts =
PullUpConflictsUtil.checkConflicts(infos, mySubclass, null, targetPackage, targetDirectory, dialog.getContainmentVerifier());
if (!conflicts.isEmpty()) {
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
@@ -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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiField> 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<PsiField> 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<PsiElement, String> conflicts) {
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts) {
if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) {
throw new RuntimeException(StringUtil.join(conflicts.values(), "\n"));
}
return super.showConflicts(conflicts);
}
private Map<PsiElement, String> calculateInitializersConflicts() {
final Map<PsiElement, String> out = new HashMap<PsiElement, String>();
private void calculateInitializersConflicts(MultiMap<PsiElement, String> 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) {
@@ -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<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts) {
private void analyzeConflicts(UsageInfo[] usage, MultiMap<PsiElement, String> conflicts) {
HashMap<PsiElement,HashSet<PsiElement>> reportedNonDelegatedUsages = new HashMap<PsiElement, HashSet<PsiElement>>();
HashMap<PsiClass,HashSet<PsiElement>> reportedUpcasts = new HashMap<PsiClass, HashSet<PsiElement>>();
// 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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts) {
final MultiMap<PsiElement, String> conflicts) {
element.accept(collector);
final Map<PsiMember, Set<PsiMember>> 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));
}
}
}
@@ -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<PsiElement, String> conflicts = getConflicts(usages);
MultiMap<PsiElement, String> conflicts = getConflicts(usages);
if (!conflicts.isEmpty()) {
return showConflicts(conflicts);
}
return super.preprocessUsages(refUsages);
}
public Map<PsiElement, String> getConflicts(final UsageInfo[] usages) {
Map<PsiElement, String> result = new LinkedHashMap<PsiElement, String>();
public MultiMap<PsiElement, String> getConflicts(final UsageInfo[] usages) {
MultiMap<PsiElement, String> result = new MultiMap<PsiElement, String>();
ReferencedElementsCollector collector = new ReferencedElementsCollector() {
protected void checkAddMember(@NotNull final PsiMember member) {
if (PsiTreeUtil.isAncestor(myClass, member, false)) {
@@ -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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts) {
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts) {
if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) {
throw new RuntimeException(StringUtil.join(conflicts.values(), "\n"));
}
@@ -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<PsiElement, String> findConflicts(IntroduceParameterData data, UsageInfo[] usages);
void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap<PsiElement, String> conflicts);
boolean processChangeMethodUsage(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException;
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
AnySameNameVariables anySameNameVariables = new AnySameNameVariables();
myMethodToReplaceIn.accept(anySameNameVariables);
final Pair<PsiElement, String> 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<PsiElement, String> conflicts) {
private void detectAccessibilityConflicts(final UsageInfo[] usageArray, MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<PsiElement, String> findConflicts(IntroduceParameterData data, UsageInfo[] usages) {
return Collections.emptyMap();
public void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap<PsiElement, String> conflicts) {
}
public boolean processChangeMethodSignature(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException {
@@ -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<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final HashSet<PsiVariable> reportedVariables = new HashSet<PsiVariable>();
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);
}
}
};
@@ -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<PsiElement, String> conflicts, final Project project, IntroduceVariableSettings dialog);
protected abstract boolean reportConflicts(MultiMap<PsiElement,String> conflicts, final Project project, IntroduceVariableSettings dialog);
public static void checkInLoopCondition(PsiExpression occurence, Map<PsiElement, String> conflicts) {
public static void checkInLoopCondition(PsiExpression occurence, MultiMap<PsiElement, String> conflicts) {
final PsiElement loopForLoopCondition = RefactoringUtil.getLoopForLoopCondition(occurence);
if (loopForLoopCondition == null) return;
final List<PsiVariable> 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"));
}
}
@@ -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<PsiElement, String> conflicts, final Project project, IntroduceVariableSettings dialog) {
protected boolean reportConflicts(final MultiMap<PsiElement,String> conflicts, final Project project, IntroduceVariableSettings dialog) {
ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts);
conflictsDialog.show();
final boolean ok = conflictsDialog.isOK();
@@ -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<UsageInfo[]> refUsages) {
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts) {
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts) {
if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) {
throw new RuntimeException(StringUtil.join(conflicts.values(), "\n"));
}
@@ -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<P
}
}
protected Map<PsiElement,String> getConflictDescriptions(final UsageInfo[] usages) {
final Map<PsiElement, String> conflicts = super.getConflictDescriptions(usages);
protected MultiMap<PsiElement,String> getConflictDescriptions(final UsageInfo[] usages) {
final MultiMap<PsiElement, String> conflicts = super.getConflictDescriptions(usages);
//Check fields already exist
if (mySettings.isMakeClassParameter()) {
@@ -305,7 +305,7 @@ public class MakeClassStaticProcessor extends MakeMethodOrClassStaticProcessor<P
if (existing != null) {
String message = RefactoringBundle.message("there.is.already.a.0.in.1", RefactoringUIUtil.getDescription(existing, false),
RefactoringUIUtil.getDescription(myMember, false));
conflicts.put(existing, message);
conflicts.putValue(existing, message);
}
}
@@ -318,7 +318,7 @@ public class MakeClassStaticProcessor extends MakeMethodOrClassStaticProcessor<P
if (existing != null) {
String message = RefactoringBundle.message("there.is.already.a.0.in.1", RefactoringUIUtil.getDescription(existing, false),
RefactoringUIUtil.getDescription(myMember, false));
conflicts.put(existing, message);
conflicts.putValue(existing, message);
}
}
}
@@ -29,6 +29,7 @@ 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.*;
@@ -54,7 +55,7 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
protected final boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
if (myPrepareSuccessfulSwingThreadCallback != null) {
Map<PsiElement, String> conflicts = getConflictDescriptions(usagesIn);
MultiMap<PsiElement, String> conflicts = getConflictDescriptions(usagesIn);
if (conflicts.size() > 0) {
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
conflictsDialog.show();
@@ -93,8 +94,8 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
return result.toArray(new UsageInfo[result.size()]);
}
protected Map<PsiElement, String> getConflictDescriptions(UsageInfo[] usages) {
Map<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
protected MultiMap<PsiElement,String> getConflictDescriptions(UsageInfo[] usages) {
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
HashSet<PsiElement> processed = new HashSet<PsiElement>();
String typeString = StringUtil.capitalize(UsageViewUtil.getType(myMember));
for (UsageInfo usageInfo : usages) {
@@ -115,12 +116,12 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
if (mySettings.getNameForField(field) == null) {
String message = RefactoringBundle.message("0.uses.non.static.1.which.is.not.passed.as.a.parameter", typeString,
RefactoringUIUtil.getDescription(field, true));
conflicts.put(field, message);
conflicts.putValue(field, message);
}
}
else {
String message = RefactoringBundle.message("0.uses.1.which.needs.class.instance", typeString, RefactoringUIUtil.getDescription(referencedElement, true));
conflicts.put(referencedElement, message);
conflicts.putValue(referencedElement, message);
}
}
}
@@ -129,7 +130,7 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
final PsiMethod overridingMethod = ((PsiMethod)usageInfo.getElement());
String message = RefactoringBundle.message("method.0.is.overridden.by.1", RefactoringUIUtil.getDescription(myMember, false),
RefactoringUIUtil.getDescription(overridingMethod, true));
conflicts.put(overridingMethod, message);
conflicts.putValue(overridingMethod, message);
}
else {
PsiElement element = usageInfo.getElement();
@@ -147,31 +148,29 @@ public abstract class MakeMethodOrClassStaticProcessor<T extends PsiTypeParamete
if (inaccessible.isEmpty()) continue;
final Map<PsiElement, String> inaccessibleConflicts = createInaccessibleFieldsConflictDescription(inaccessible, container);
conflicts.putAll(inaccessibleConflicts);
createInaccessibleFieldsConflictDescription(inaccessible, container, conflicts);
}
}
return conflicts;
}
private static Map<PsiElement, String> createInaccessibleFieldsConflictDescription(ArrayList<PsiField> inaccessible, PsiElement container) {
private static void createInaccessibleFieldsConflictDescription(ArrayList<PsiField> inaccessible, PsiElement container,
MultiMap<PsiElement, String> conflicts) {
if (inaccessible.size() == 1) {
final PsiField field = inaccessible.get(0);
return Collections.<PsiElement, String>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<PsiElement, String> result = new HashMap<PsiElement, String>();
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;
}
}
@@ -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<PsiElement,String> conflicts = PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, null, null, dialog.getContainmentVerifier());
MultiMap<PsiElement,String> conflicts = PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, null, null, dialog.getContainmentVerifier());
if (!conflicts.isEmpty()) {
ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
conflictsDialog.show();
@@ -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<PsiElement, String> checkConflicts(final MemberInfo[] infos,
public static MultiMap<PsiElement, String> checkConflicts(final MemberInfo[] infos,
PsiClass subclass,
PsiClass superClass,
PsiPackage targetPackage,
@@ -60,7 +61,7 @@ public class PullUpConflictsUtil {
movedMembers.add(member);
}
}
final LinkedHashMap<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflictsList) {
private static void checkInterfaceTarget(MemberInfo[] infos, MultiMap<PsiElement, String> 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<PsiElement, String> conflictsList) {
MultiMap<PsiElement, String> 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<PsiElement, String> myConflictsList;
private final MultiMap<PsiElement, String> myConflictsList;
private final InterfaceContainmentVerifier myInterfaceContainmentVerifier;
ConflictingUsagesOfSubClassMembers(PsiElement scope,
Set<PsiElement> movedMembers, Set<PsiMethod> abstractMethods,
PsiClass subclass, PsiClass superClass,
PsiPackage targetPackage, LinkedHashMap<PsiElement, String> conflictsList,
PsiPackage targetPackage, MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<PsiMember> myMovedMembers;
private final Set<PsiMember> myAbstractMembers;
private final Map<PsiElement, String> myConflicts;
private final MultiMap<PsiElement, String> myConflicts;
public PushDownConflicts(PsiClass aClass, MemberInfo[] memberInfos) {
@@ -33,14 +35,14 @@ public class PushDownConflicts {
}
}
myConflicts = new HashMap<PsiElement, String>();
myConflicts = new MultiMap<PsiElement, String>();
}
public boolean isAnyConflicts() {
return !myConflicts.isEmpty();
}
public Map<PsiElement, String> getConflicts() {
public MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<PsiElement> elements,
Map<PsiElement,String> conflicts, final UsageInfo[] usages) {
MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages) {
RefactoringUtil.analyzeModuleConflicts(getTargetPackage().getManager().getProject(), elements, usages, mySourceRoot, conflicts);
}
@@ -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<PsiElement, String> getConflicts(final UsageInfo[] usages) {
Map<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
public MultiMap<PsiElement, String> getConflicts(final UsageInfo[] usages) {
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> myConflicts;
private final MultiMap<PsiElement, String> myConflicts;
private final Set<PsiElement> myReportedContainers = new HashSet<PsiElement>();
public ConflictsCollector(final Map<PsiElement, String> conflicts) {
public ConflictsCollector(final MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<UsageInfo> allUsages = new ArrayList<UsageInfo>();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> myConflicts;
private final MultiMap<PsiElement, String> myConflicts;
public ConflictsUsageInfo(PsiElement pseudoElement, Map<PsiElement, String> conflicts) {
public ConflictsUsageInfo(PsiElement pseudoElement, MultiMap<PsiElement, String> conflicts) {
super(pseudoElement);
myConflicts = conflicts;
}
public Map<PsiElement, String> getConflicts() {
public MultiMap<PsiElement, String> getConflicts() {
return myConflicts;
}
}
@@ -164,11 +165,15 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
final UsageInfo[] usages = refUsages.get();
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
ArrayList<UsageInfo> filteredUsages = new ArrayList<UsageInfo>();
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<PsiElement, String> conflicts) {
private void detectPackageLocalsUsed(final MultiMap<PsiElement, String> 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<PsiElement, String> conflicts) {
private void detectPackageLocalsMoved(final UsageInfo[] usages, final MultiMap<PsiElement, String> conflicts) {
// final HashSet reportedPackageLocalUsed = new HashSet();
final HashSet<PsiClass> movedClasses = new HashSet<PsiClass>();
final HashMap<PsiClass,HashSet<PsiElement>> reportedClassToContainers = new HashMap<PsiClass, HashSet<PsiElement>>();
@@ -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<PsiElement, String> myConflicts;
private final MultiMap<PsiElement, String> myConflicts;
private final HashMap<PsiModifierListOwner,HashSet<PsiElement>> myReportedElementToContainer = new HashMap<PsiModifierListOwner, HashSet<PsiElement>>();
private final HashMap<PsiClass, RefactoringUtil.IsDescendantOf> myIsDescendantOfCache = new HashMap<PsiClass,RefactoringUtil.IsDescendantOf>();
public MyClassInstanceReferenceVisitor(Map<PsiElement, String> conflicts) {
public MyClassInstanceReferenceVisitor(MultiMap<PsiElement, String> 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));
}
}
}
@@ -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<PsiElement> elements,
Map<PsiElement,String> conflicts, final UsageInfo[] usages) {
MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages) {
}
public PsiDirectory getTargetIfExists(PsiDirectory source) {
@@ -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<PsiElement,HashSet<PsiElement>> myReported = new HashMap<PsiElement, HashSet<PsiElement>>();
private final PsiElement[] myElementsToMove;
private final Map<PsiElement, String> myConflicts;
private final MultiMap<PsiElement, String> myConflicts;
private final PackageWrapper myTargetPackage;
public PackageLocalsUsageCollector(final PsiElement[] elementsToMove, final PackageWrapper targetPackage, Map<PsiElement,String> conflicts) {
public PackageLocalsUsageCollector(final PsiElement[] elementsToMove, final PackageWrapper targetPackage, MultiMap<PsiElement,String> 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);
}
}
@@ -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<PsiElement> elements,
Map<PsiElement,String> conflicts, final UsageInfo[] usages) {
MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages) {
RefactoringUtil.analyzeModuleConflicts(myPackage.getManager().getProject(), elements, usages, myTargetDirectory, conflicts);
}
@@ -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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
class Visitor extends JavaRecursiveElementWalkingVisitor {
private final HashMap<PsiElement,HashSet<PsiElement>> reported = new HashMap<PsiElement, HashSet<PsiElement>>();
@@ -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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
final UsageInfo[] usages = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final Set<PsiMember> members = new HashSet<PsiMember>();
members.add(myMethod);
if (myTargetVariable instanceof PsiField) members.add((PsiMember)myTargetVariable);
if (!myTargetClass.isInterface()) {
conflicts.putAll(MoveMembersProcessor.analyzeAccessibilityConflicts(members, myTargetClass, new LinkedHashMap<PsiElement, String>(), 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<PsiElement, String>(), 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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts, final UsageInfo[] usages) throws IncorrectOperationException {
private void addInaccessiblleConflicts(final MultiMap<PsiElement, String> 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<PsiElement, String> conflicts = analyzeMoveConflicts(myMembersToMove, myTargetClass, myNewVisibility);
if (!conflicts.isEmpty()) {
ConflictsDialog dialog = new ConflictsDialog(myProject, conflicts);
dialog.show();
return dialog.isOK();
}
return true;
}
private static Map<PsiElement, String> analyzeMoveConflicts(@NotNull Set<PsiMember> membersToMove, final PsiClass targetClass, final String newVisibility) {
final LinkedHashMap<PsiElement, String> conflicts = new LinkedHashMap<PsiElement, String>();
private static void analyzeMoveConflicts(@NotNull Set<PsiMember> membersToMove, final PsiClass targetClass, final String newVisibility,
MultiMap<PsiElement, String> 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<PsiElement, String> analyzeAccessibilityConflicts(@NotNull Set<PsiMember> membersToMove,
public static void analyzeAccessibilityConflicts(@NotNull Set<PsiMember> membersToMove,
final PsiClass targetClass,
final LinkedHashMap<PsiElement, String> conflicts, String newVisibility) {
final MultiMap<PsiElement, String> 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<PsiMember> membersToMove, PsiClass newContext, LinkedHashMap<PsiElement, String> conflicts) {
private static void checkUsedElements(PsiMember member, PsiElement scope, @NotNull Set<PsiMember> membersToMove, PsiClass newContext, MultiMap<PsiElement, String> 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<PsiElement, String> conflicts) {
MultiMap<PsiElement, String> 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);
}
}
@@ -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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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");
}
}
}
@@ -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<PsiElement, String> conflicts) {
public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap<PsiElement,String> 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));
}
}
}
@@ -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<PsiElement, String> conflicts) {
public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap<PsiElement, String> conflicts) {
if (element instanceof PsiCompiledElement) return;
PsiMethod refactoredMethod = (PsiMethod)element;
if (newName.equals(refactoredMethod.getName())) return;
@@ -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<PsiElement, String> conflicts) {
public void findExistingNameConflicts(PsiElement element, String newName, MultiMap<PsiElement,String> 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");
}
}
@@ -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<PsiElement, String> conflicts) {
protected boolean showConflicts(MultiMap<PsiElement, String> 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<UsageInfo[]> refUsages) {
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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);
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usages = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement> reportedContainers = new HashSet<PsiElement>();
@@ -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);
}
}
}
@@ -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<PsiElement,String> conflicts) {
final MultiMap<PsiElement,String> 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));
}
}
@@ -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<FixableUsageInfo> usages);
protected static void checkConflicts(final Ref<UsageInfo[]> refUsages, final Map<PsiElement, String> conflicts) {
protected static void checkConflicts(final Ref<UsageInfo[]> refUsages, final MultiMap<PsiElement,String> 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));
}
}
}
@@ -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<? extends PsiElement> scope,
final UsageInfo[] usages,
PsiElement target,
final Map<PsiElement, String> conflicts) {
final MultiMap<PsiElement,String> conflicts) {
if (scope == null) return;
final VirtualFile vFile = PsiUtilBase.getVirtualFile(target);
if (vFile == null) return;
@@ -1103,7 +1104,7 @@ public class RefactoringUtil {
final Collection<? extends PsiElement> scopes,
final UsageInfo[] usages,
final VirtualFile vFile,
final Map<PsiElement, String> conflicts) {
final MultiMap<PsiElement, String> 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);
}
}
}
@@ -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<UsageInfo[]> refUsages) {
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement,String> conflicts) {
protected boolean showConflicts(final MultiMap<PsiElement, String> conflicts) {
if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) {
throw new RuntimeException(StringUtil.join(conflicts.values(), "\n"));
}
@@ -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<PsiElement,String> conflicts = processor.getConflicts(usages);
MultiMap<PsiElement,String> conflicts = processor.getConflicts(usages);
assertSameElements(conflicts.values() , expectedConflicts);
}
@@ -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<PsiElement, String> conflicts) {
protected boolean showConflicts(MultiMap<PsiElement, String> conflicts) {
if (!conflicts.isEmpty()) {
throw new RuntimeException("Found conflicts: " + conflicts.values().iterator().next());
}
@@ -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<PsiElement, String> conflicts) {
protected boolean showConflicts(MultiMap<PsiElement,String> conflicts) {
if (failure ? conflicts.isEmpty() : !conflicts.isEmpty()) {
fail(failure ? "Conflict was not detected" : "False conflict was detected");
}
@@ -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<PsiElement,String> conflicts = processor.getConflicts(usages);
MultiMap<PsiElement,String> conflicts = processor.getConflicts(usages);
assertEquals(0, conflicts.size());
processor.run();
@@ -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<PsiElement,String> conflicts = processor.getConflicts(usages);
MultiMap<PsiElement,String> conflicts = processor.getConflicts(usages);
assertEquals(1, conflicts.size());
assertEquals("Field <b><code>C2.a</code></b> that is used in inlined method is not accessible from call site(s) in method <b><code>C2User.test()</code></b>",
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<PsiElement, String> conflicts = processor.getConflicts(usages);
MultiMap<PsiElement, String> conflicts = processor.getConflicts(usages);
assertEquals(0, conflicts.size());
processor.run();
}
@@ -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<PsiElement> elements, Map<PsiElement,String> conflicts, final UsageInfo[] usages);
void analyzeModuleConflicts(final Collection<PsiElement> elements, MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages);
}
@@ -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<PsiElement, String> conflicts) {
protected boolean showConflicts(final MultiMap<PsiElement,String> conflicts) {
if (!conflicts.isEmpty() && myPrepareSuccessfulSwingThreadCallback != null) {
final ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts);
conflictsDialog.show();
@@ -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<Language, InlineHandler.Inliner> inliners = new HashMap<Language, InlineHandler.Inliner>();
final Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<Language, InlineHandler.Inliner> inliners,
final Map<PsiElement, String> conflicts) {
final MultiMap<PsiElement, String> conflicts) {
final Language language = reference.getElement().getLanguage();
final InlineHandler.Inliner inliner = inliners.get(language);
if (inliner != null) {
final Map<PsiElement, String> refConflicts = inliner.getConflicts(reference, element);
if (refConflicts != null) {
conflicts.putAll(refConflicts);
for (PsiElement psiElement : refConflicts.keySet()) {
conflicts.putValue(psiElement, refConflicts.get(psiElement));
}
}
}
}
@@ -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<UsageInfo[]> refUsages) {
UsageInfo[] usagesIn = refUsages.get();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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);
@@ -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<PsiElement, String> allRenames) {
}
public void findExistingNameConflicts(final PsiElement element, final String newName, final Map<PsiElement, String> conflicts) {
public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap<PsiElement,String> conflicts) {
}
@NotNull
@@ -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<PsiElement, String> getConflictDescriptions(UsageInfo[] usages) {
Map<PsiElement, String> descriptions = new HashMap<PsiElement, String>();
public static void addConflictDescriptions(UsageInfo[] usages, MultiMap<PsiElement, String> 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) {
@@ -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<PsiElement, String> myElementConflictDescription;
private MultiMap<PsiElement, String> myElementConflictDescription;
private final Project myProject;
public ConflictsDialog(Project project, Map<PsiElement, String> conflictDescriptions) {
public ConflictsDialog(Project project, MultiMap<PsiElement, String> conflictDescriptions) {
super(project, true);
myProject = project;
myConflictDescriptions = ArrayUtil.toStringArray(conflictDescriptions.values());
List<String> conflicts = new ArrayList<String>();
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() {
@@ -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.
@@ -945,7 +945,7 @@ public class StringUtil {
return result.toString();
}
@NotNull public static String join(@NotNull Collection<String> strings, @NotNull final String separator) {
@NotNull public static String join(@NotNull Collection<? extends String> strings, @NotNull final String separator) {
final StringBuilder result = new StringBuilder();
for (String string : strings) {
if (string != null && string.length() != 0) {
@@ -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<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
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<PsiElement, String> conflicts, final Project project) {
private static boolean reportConflicts(final MultiMap<PsiElement,String> conflicts, final Project project) {
if (conflicts.size() == 0) return true;
ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts);
conflictsDialog.show();
@@ -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<PsiElement, String> conflicts, @NotNull String varName) {
public static boolean validateNewParameterName(GrParameter variable, MultiMap<PsiElement,String> 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<PsiElement, String> conflicts,
MultiMap<PsiElement, String> 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<PsiElement, String> conflicts,
MultiMap<PsiElement, String> 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<PsiElement, String> conflicts, final String varName) {
private static void validateVariableOccurrencesDownImpl(final PsiElement child, final MultiMap<PsiElement, String> 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<PsiElement, String> conflicts) {
private static void addConflict(final String varName, final PsiNamedElement element, final MultiMap<PsiElement, String> 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<PsiElement, String> confl = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> confl = new MultiMap<PsiElement, String>();
while (!validateNewParameterName(myParameter, confl, name)) {
name = myName + i;
i++;
confl = new HashMap<PsiElement, String>();
confl = new MultiMap<PsiElement, String>();
}
return name;
}
@@ -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
@@ -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
@@ -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<PsiElement, String> findConflicts(IntroduceParameterData data, UsageInfo[] usages) {
public void findConflicts(IntroduceParameterData data, UsageInfo[] usages, MultiMap<PsiElement, String> conflicts) {
Set<UsageInfo> groovyUsages = new HashSet<UsageInfo>();
for (UsageInfo usage : usages) {
if (isMethodUsage(usage)) groovyUsages.add(usage);
}
if (groovyUsages.size() == 0) return Collections.emptyMap();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
if (groovyUsages.size() == 0) return;
data.getParameterInitializer().accept(new InitializerVisitor(conflicts));
return conflicts;
}
private static class InitializerVisitor extends JavaRecursiveElementWalkingVisitor {
private final Map<PsiElement, String> conflicts;
private final MultiMap<PsiElement, String> conflicts;
private InitializerVisitor(Map<PsiElement, String> conflicts) {
private InitializerVisitor(MultiMap<PsiElement, String> 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"));
}
}
}
@@ -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<UsageInfo> allUsages = new ArrayList<UsageInfo>();
Map<PsiElement, String> conflicts = new HashMap<PsiElement, String>();
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final List<PsiElement> 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<UsageInfo[]> refUsages) {
return showConflicts(Collections.<PsiElement, String>emptyMap());
return showConflicts(new MultiMap<PsiElement, String>());
}
@Override