change signature: do not show dialog

This commit is contained in:
anna
2010-09-14 15:04:34 +04:00
parent e56209434d
commit 9283be8e8e
13 changed files with 334 additions and 53 deletions
@@ -130,6 +130,9 @@ public class ChangeSignatureProcessor extends ChangeSignatureProcessorBase {
}
protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
for (ChangeSignatureUsageProcessor processor : ChangeSignatureUsageProcessor.EP_NAME.getExtensions()) {
processor.setupDefaultValues(myChangeInfo, refUsages, myProject);
}
MultiMap<PsiElement, String> conflictDescriptions = new MultiMap<PsiElement, String>();
for (ChangeSignatureUsageProcessor usageProcessor : ChangeSignatureUsageProcessor.EP_NAME.getExtensions()) {
final MultiMap<PsiElement, String> conflicts = usageProcessor.findConflicts(myChangeInfo, refUsages);
@@ -15,7 +15,10 @@
*/
package com.intellij.refactoring.changeSignature;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.tree.Factory;
import com.intellij.psi.impl.source.tree.SharedImplUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.util.IncorrectOperationException;
@@ -54,17 +57,34 @@ public class ChangeSignatureUtil {
Child oldElement = index < elements.size() ? elements.get(index) : null;
Child newElement = newElements.get(index);
if (!newElement.equals(oldElement)) {
if (oldElement != null && elementsToRemove.contains(oldElement)) {
oldElement.delete();
index--;
}
else {
assert list.isWritable() : PsiUtilBase.getVirtualFile(list);
list.addBefore(newElement, oldElement);
if (list.equals(newElement.getParent())) {
newElement.delete();
if (newElement != null) {
if (!newElement.equals(oldElement)) {
if (oldElement != null && elementsToRemove.contains(oldElement)) {
oldElement.delete();
index--;
}
else {
assert list.isWritable() : PsiUtilBase.getVirtualFile(list);
list.addBefore(newElement, oldElement);
if (list.equals(newElement.getParent())) {
newElement.delete();
}
}
}
} else {
PsiElement anchor = null;
if (index == 0) {
anchor = list.getFirstChild();
} else {
anchor = elements.get(index - 1);
}
final PsiElement psi = Factory
.createSingleLeafElement(JavaTokenType.COMMA, ",", 0, 1, SharedImplUtil.findCharTableByTree(list.getNode()), list.getManager())
.getPsi();
if (anchor != null) {
list.addAfter(psi, anchor);
} else {
list.add(psi);
}
}
index++;
@@ -17,7 +17,6 @@ package com.intellij.refactoring.changeSignature;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
@@ -26,16 +25,13 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.CanonicalTypes;
import com.intellij.usageView.UsageViewUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.*;
/**
* User: anna
@@ -68,29 +64,7 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
final MyJavaChangeInfo info = (MyJavaChangeInfo)changeInfo;
if (!info.getMethod().equals(method)) return null;
if (!info.equals(fromMethod)) {
final JavaParameterInfo[] oldParameters = info.getNewParameters();
for (int i = 0; i < parameterInfos.length; i++) {
ParameterInfoImpl parameterInfo = parameterInfos[i];
JavaParameterInfo oldParameter = null;
for (JavaParameterInfo parameter : oldParameters) {
if (Comparing.strEqual(parameter.getName(), parameterInfo.getName()) &&
Comparing.strEqual(parameter.getTypeText(), parameterInfo.getTypeText())) {
oldParameter = parameter;
break;
}
}
if (oldParameter == null && oldParameters.length > i && info.getOldParameterNames().length > i) {
if (Comparing.strEqual(info.getOldParameterNames()[i], parameterInfo.getName()) ||
Comparing.strEqual(info.getOldParameterTypes()[i], parameterInfo.getTypeText())) {
oldParameter = oldParameters[i];
}
}
final int oldParameterIndex = oldParameter != null ? oldParameter.getOldIndex() : -1;
parameterInfos[i] = new ParameterInfoImpl(oldParameterIndex,
parameterInfo.getName(),
parameterInfo.getTypeWrapper().getType(element, element.getManager()),
oldParameterIndex == -1 ? "intellijidearulezzz" : "");
}
createParametersInfo(element, parameterInfos, info);
if (info.isReturnTypeChanged()) {
final String visibility = info.getNewVisibility();
if (Comparing.strEqual(visibility, PsiModifier.PRIVATE) &&
@@ -123,11 +97,61 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
javaChangeInfo.setSuperMethod(info.getSuperMethod());
return javaChangeInfo;
}
return changeInfo;
}
}
return null;
}
private static void createParametersInfo(PsiElement element,
ParameterInfoImpl[] parameterInfos,
MyJavaChangeInfo info) {
final JavaParameterInfo[] oldParameters = info.getNewParameters();
final String[] oldParameterNames = info.getOldParameterNames();
final String[] oldParameterTypes = info.getOldParameterTypes();
final Map<JavaParameterInfo, Integer> untouchedParams = new HashMap<JavaParameterInfo, Integer>();
for (int i = 0; i < parameterInfos.length; i++) {
ParameterInfoImpl parameterInfo = parameterInfos[i];
JavaParameterInfo oldParameter = null;
for (JavaParameterInfo parameter : oldParameters) {
if (Comparing.strEqual(parameter.getName(), parameterInfo.getName()) &&
Comparing.strEqual(parameter.getTypeText(), parameterInfo.getTypeText())) {
oldParameter = parameter;
break;
}
}
if (oldParameter != null) {
parameterInfos[i] = new ParameterInfoImpl(oldParameter.getOldIndex(),
oldParameter.getName(),
oldParameter.getTypeWrapper().getType(element, element.getManager()),
null);
untouchedParams.put(parameterInfos[i], oldParameter.getOldIndex());
}
}
for (int i = 0; i < parameterInfos.length; i++) {
ParameterInfoImpl parameterInfo = parameterInfos[i];
if (!untouchedParams.containsKey(parameterInfo)) {
JavaParameterInfo oldParameter = null;
if (oldParameters.length > i && oldParameterNames.length > i) {
if (Comparing.strEqual(oldParameterNames[i], parameterInfo.getName()) ||
Comparing.strEqual(oldParameterTypes[i], parameterInfo.getTypeText())) {
if (!untouchedParams.containsValue(oldParameters[i].getOldIndex())) {
oldParameter = oldParameters[i];
}
}
}
parameterInfos[i] = new ParameterInfoImpl(oldParameter != null ? oldParameter.getOldIndex() : - 1,
parameterInfo.getName(),
parameterInfo.getTypeWrapper().getType(element, element.getManager()),
null);
}
}
}
private static class MyJavaChangeInfo extends JavaChangeInfoImpl {
private PsiMethod mySuperMethod;
private MyJavaChangeInfo(String newVisibility,
@@ -164,11 +188,11 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
final MyJavaChangeInfo info = (MyJavaChangeInfo)changeInfo;
final PsiMethod method = info.getSuperMethod();
if (ApplicationManager.getApplication().isUnitTestMode()) {
//if (ApplicationManager.getApplication().isUnitTestMode()) {
temporallyRevertChanges(method, oldText);
createChangeSignatureProcessor(info, method).run();
return true;
}
/*}
final JavaChangeSignatureDialog dialog =
new JavaChangeSignatureDialog(method.getProject(), new JavaMethodDescriptor(info.getMethod()) {
@Override
@@ -196,7 +220,7 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
}
};
dialog.show();
return dialog.isOK();
return dialog.isOK();*/
}
return false;
@@ -17,7 +17,9 @@ package com.intellij.refactoring.changeSignature;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.lang.StdLanguages;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -228,7 +230,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
final PsiMethod caller = RefactoringUtil.getEnclosingMethod(ref);
if (toChangeArguments) {
final PsiExpressionList list = RefactoringUtil.getArgumentListByMethodReference(ref);
boolean toInsertDefaultValue = !(changeInfo instanceof JavaChangeInfoImpl) || !((JavaChangeInfoImpl)changeInfo).propagateParametersMethods.contains(caller);
boolean toInsertDefaultValue = needDefaultValue(changeInfo, caller);
if (toInsertDefaultValue && ref instanceof PsiReferenceExpression) {
final PsiExpression qualifierExpression = ((PsiReferenceExpression)ref).getQualifierExpression();
if (qualifierExpression instanceof PsiSuperExpression && callerSignatureIsAboutToChangeToo(caller, usages)) {
@@ -513,7 +515,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
}
}
final PsiCallExpression callExpression = PsiTreeUtil.getParentOfType(list, PsiCallExpression.class);
return callExpression != null ? info.getValue(callExpression) : factory.createExpressionFromText(info.getDefaultValue(), list);
final String defaultValue = info.getDefaultValue();
return callExpression != null ? info.getValue(callExpression) : defaultValue.length() > 0 ? factory.createExpressionFromText(defaultValue, list) : null;
}
@@ -532,6 +535,44 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
return false;
}
@Override
public void setupDefaultValues(ChangeInfo changeInfo, Ref<UsageInfo[]> refUsages, Project project) {
if (!(changeInfo instanceof JavaChangeInfo)) return;
for (UsageInfo usageInfo : refUsages.get()) {
if (usageInfo instanceof MethodCallUsageInfo) {
MethodCallUsageInfo methodCallUsageInfo = (MethodCallUsageInfo)usageInfo;
if (methodCallUsageInfo.isToChangeArguments()){
final boolean needDefaultValue = needDefaultValue(changeInfo, RefactoringUtil.getEnclosingMethod(methodCallUsageInfo.getElement()));
if (needDefaultValue) {
final ParameterInfo[] parameters = changeInfo.getNewParameters();
for (ParameterInfo parameter : parameters) {
final String defaultValue = parameter.getDefaultValue();
if (defaultValue == null && parameter.getOldIndex() == -1) {
((ParameterInfoImpl)parameter).setDefaultValue("");
if (!ApplicationManager.getApplication().isUnitTestMode()) {
final DefaultValueChooser chooser = new DefaultValueChooser(project, parameter.getName());
chooser.show();
if (chooser.isOK()) {
if (chooser.feelLucky()) {
parameter.setUseAnySingleVariable(true);
} else {
((ParameterInfoImpl)parameter).setDefaultValue(chooser.getDefaultValue());
}
}
}
}
}
}
}
}
}
}
private static boolean needDefaultValue(ChangeInfo changeInfo, PsiMethod method) {
return !(changeInfo instanceof JavaChangeInfoImpl) ||
!((JavaChangeInfoImpl)changeInfo).propagateParametersMethods.contains(method);
}
private static void generateDelegate(JavaChangeInfo changeInfo) throws IncorrectOperationException {
final PsiMethod delegate = (PsiMethod)changeInfo.getMethod().copy();
final PsiClass targetClass = changeInfo.getMethod().getContainingClass();
@@ -145,6 +145,7 @@ public class ParameterInfoImpl implements JavaParameterInfo {
@Nullable
public PsiExpression getValue(final PsiCallExpression expr) throws IncorrectOperationException {
if (defaultValue != null && defaultValue.length() == 0) return null;
return JavaPsiFacade.getInstance(expr.getProject()).getElementFactory().createExpressionFromText(defaultValue, expr);
}