mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-26 19:06:24 +07:00
conflicts for duplicated type parameter name (IDEA-87473)
This commit is contained in:
+13
-1
@@ -25,6 +25,7 @@ import com.intellij.refactoring.ui.JavaCodeFragmentTableCellEditor;
|
||||
import com.intellij.refactoring.ui.RefactoringDialog;
|
||||
import com.intellij.refactoring.ui.StringTableCellEditor;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUIUtil;
|
||||
import com.intellij.ui.*;
|
||||
import com.intellij.ui.table.JBTable;
|
||||
import com.intellij.usageView.UsageViewUtil;
|
||||
@@ -39,7 +40,9 @@ import javax.swing.table.AbstractTableModel;
|
||||
import javax.swing.table.TableColumn;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author dsl
|
||||
@@ -153,10 +156,19 @@ public class ChangeClassSignatureDialog extends RefactoringDialog {
|
||||
}
|
||||
|
||||
private String validateAndCommitData() {
|
||||
final PsiTypeParameter[] parameters = myClass.getTypeParameters();
|
||||
final Map<String, TypeParameterInfo> infos = new HashMap<String, TypeParameterInfo>();
|
||||
for (final TypeParameterInfo info : myTypeParameterInfos) {
|
||||
if (!info.isForExistingParameter() && !JavaPsiFacade.getInstance(myClass.getProject()).getNameHelper().isIdentifier(info.getNewName())) {
|
||||
if (!info.isForExistingParameter() &&
|
||||
!JavaPsiFacade.getInstance(myClass.getProject()).getNameHelper().isIdentifier(info.getNewName())) {
|
||||
return RefactoringBundle.message("error.wrong.name.input", info.getNewName());
|
||||
}
|
||||
final String newName = info.isForExistingParameter() ? parameters[info.getOldParameterIndex()].getName() : info.getNewName();
|
||||
TypeParameterInfo existing = infos.get(newName);
|
||||
if (existing != null) {
|
||||
return myClass.getName() + " already contains type parameter " + newName;
|
||||
}
|
||||
infos.put(newName, info);
|
||||
}
|
||||
LOG.assertTrue(myTypeCodeFragments.size() == myTypeParameterInfos.size());
|
||||
for (int i = 0; i < myTypeCodeFragments.size(); i++) {
|
||||
|
||||
+20
@@ -19,16 +19,19 @@ import com.intellij.history.LocalHistory;
|
||||
import com.intellij.history.LocalHistoryAction;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.refactoring.BaseRefactoringProcessor;
|
||||
import com.intellij.refactoring.changeSignature.ChangeSignatureUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUIUtil;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.usageView.UsageViewDescriptor;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
@@ -62,6 +65,23 @@ public class ChangeClassSignatureProcessor extends BaseRefactoringProcessor {
|
||||
return new ChangeClassSigntaureViewDescriptor(myClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
|
||||
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
|
||||
|
||||
final PsiTypeParameter[] parameters = myClass.getTypeParameters();
|
||||
final Map<String, TypeParameterInfo> infos = new HashMap<String, TypeParameterInfo>();
|
||||
for (TypeParameterInfo info : myNewSignature) {
|
||||
final String newName = info.isForExistingParameter() ? parameters[info.getOldParameterIndex()].getName() : info.getNewName();
|
||||
TypeParameterInfo existing = infos.get(newName);
|
||||
if (existing != null) {
|
||||
conflicts.putValue(myClass, RefactoringUIUtil.getDescription(myClass, false) + " already contains type parameter " + newName);
|
||||
}
|
||||
infos.put(newName, info);
|
||||
}
|
||||
return showConflicts(conflicts, refUsages.get());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
protected UsageInfo[] findUsages() {
|
||||
GlobalSearchScope projectScope = GlobalSearchScope.projectScope(myProject);
|
||||
|
||||
@@ -34,7 +34,9 @@ import com.intellij.refactoring.HelpID;
|
||||
import com.intellij.refactoring.JavaRefactoringSettings;
|
||||
import com.intellij.refactoring.RefactoringBundle;
|
||||
import com.intellij.refactoring.listeners.RefactoringElementListener;
|
||||
import com.intellij.refactoring.util.ConflictsUtil;
|
||||
import com.intellij.refactoring.util.MoveRenameUsageInfo;
|
||||
import com.intellij.refactoring.util.RefactoringUIUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUtil;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
@@ -153,6 +155,22 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor {
|
||||
}
|
||||
}
|
||||
findSubmemberHidesMemberCollisions(aClass, newName, result);
|
||||
|
||||
if (aClass instanceof PsiTypeParameter) {
|
||||
final PsiTypeParameterListOwner owner = ((PsiTypeParameter)aClass).getOwner();
|
||||
if (owner != null) {
|
||||
for (PsiTypeParameter typeParameter : owner.getTypeParameters()) {
|
||||
if (Comparing.equal(newName, typeParameter.getName())) {
|
||||
result.add(new UnresolvableCollisionUsageInfo(aClass, typeParameter) {
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "There is already type parameter in " + RefactoringUIUtil.getDescription(aClass, false) + " with name " + newName;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void findSubmemberHidesMemberCollisions(final PsiClass aClass, final String newName, final List<UsageInfo> result) {
|
||||
|
||||
Reference in New Issue
Block a user