introduce param object: pass substitution around which won't be available after method signature is changed (IDEA-154208)

This commit is contained in:
Anna.Kozlova committed 2016-04-25 10:57:40 +02:00
1 parent d9288e4b42
commit 1ce6f8d2fa
15 files changed
+107 -50

No files matched your search

@@ -309,7 +309,7 @@ public class JavaChangeInfoImpl extends UserDataHolderBase implements JavaChange
@Nullable
public PsiExpression getValue(int i, PsiCallExpression expr) throws IncorrectOperationException {
if (defaultValues[i] != null) return defaultValues[i];
final PsiElement valueAtCallSite = newParms[i].getActualValue(expr);
final PsiElement valueAtCallSite = newParms[i].getActualValue(expr, PsiSubstitutor.EMPTY);
return valueAtCallSite instanceof PsiExpression ? (PsiExpression)valueAtCallSite : null;
}
@@ -410,7 +410,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
//This methods works equally well for primary usages as well as for propagated callers' usages
private static void fixActualArgumentsList(PsiExpressionList list,
JavaChangeInfo changeInfo,
boolean toInsertDefaultValue, PsiSubstitutor substitutor) throws IncorrectOperationException {
boolean toInsertDefaultValue,
PsiSubstitutor substitutor) throws IncorrectOperationException {
final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory();
if (changeInfo.isParameterSetOrOrderChanged()) {
if (changeInfo instanceof JavaChangeInfoImpl && ((JavaChangeInfoImpl)changeInfo).isPropagationEnabled) {
@@ -418,7 +419,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
for (ParameterInfoImpl info : createdParmsInfo) {
PsiExpression newArg;
if (toInsertDefaultValue) {
newArg = createDefaultValue(changeInfo, factory, info, list);
newArg = createDefaultValue(changeInfo, factory, info, list, substitutor);
}
else {
newArg = factory.createExpressionFromText(info.getName(), list);
@@ -486,12 +487,12 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
continue;
}
}
newArgs[i] = createActualArgument(changeInfo, list, newParms[i], toInsertDefaultValue, args);
newArgs[i] = createActualArgument(changeInfo, list, newParms[i], toInsertDefaultValue, args, substitutor);
}
if (changeInfo.isArrayToVarargs()) {
if (newVarargInitializers == null) {
newArgs[newNonVarargCount] =
createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args);
createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args, substitutor);
}
else {
System.arraycopy(newVarargInitializers, 0, newArgs, newNonVarargCount, newVarargInitializers.length);
@@ -503,7 +504,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
for (int i = newNonVarargCount; i < newArgsLength; i++){
final int oldIndex = newParms[newNonVarargCount].getOldIndex();
if (oldIndex >= 0 && oldIndex != nonVarargCount) {
newArgs[i] = createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args);
newArgs[i] = createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args, substitutor);
} else {
System.arraycopy(args, nonVarargCount, newArgs, newNonVarargCount, newVarargCount);
break;
@@ -526,7 +527,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
final PsiExpressionList list,
final JavaParameterInfo info,
final boolean toInsertDefaultValue,
final PsiExpression[] args) throws IncorrectOperationException {
final PsiExpression[] args,
PsiSubstitutor substitutor) throws IncorrectOperationException {
final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory();
final int index = info.getOldIndex();
if (index >= 0 && index < args.length) {
@@ -534,7 +536,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
}
else {
if (toInsertDefaultValue) {
return createDefaultValue(changeInfo, factory, info, list);
return createDefaultValue(changeInfo, factory, info, list, substitutor);
}
else {
return factory.createExpressionFromText(info.getName(), list);
@@ -546,7 +548,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
private static PsiExpression createDefaultValue(JavaChangeInfo changeInfo,
final PsiElementFactory factory,
final JavaParameterInfo info,
final PsiExpressionList list)
final PsiExpressionList list, PsiSubstitutor substitutor)
throws IncorrectOperationException {
if (info.isUseAnySingleVariable()) {
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(list.getProject()).getResolveHelper();
@@ -593,7 +595,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
}
final PsiCallExpression callExpression = PsiTreeUtil.getParentOfType(list, PsiCallExpression.class);
final String defaultValue = info.getDefaultValue();
return callExpression != null ? (PsiExpression)info.getActualValue(callExpression)
return callExpression != null ? (PsiExpression)info.getActualValue(callExpression, substitutor)
: !StringUtil.isEmpty(defaultValue) ? factory.createExpressionFromText(defaultValue, list) : null;
}
@@ -706,14 +708,13 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
private static void addDelegateArguments(JavaChangeInfo changeInfo, PsiElementFactory factory, final PsiCallExpression callExpression) throws IncorrectOperationException {
final JavaParameterInfo[] newParms = changeInfo.getNewParameters();
final String[] oldParameterNames = changeInfo.getOldParameterNames();
for (int i = 0; i < newParms.length; i++) {
JavaParameterInfo newParm = newParms[i];
for (JavaParameterInfo newParm : newParms) {
final PsiExpression actualArg;
if (newParm.getOldIndex() >= 0) {
actualArg = factory.createExpressionFromText(oldParameterNames[newParm.getOldIndex()], callExpression);
}
else {
actualArg = (PsiExpression)changeInfo.getActualValue(i, callExpression);
actualArg = (PsiExpression)newParm.getActualValue(callExpression, PsiSubstitutor.EMPTY);
}
final PsiExpressionList argumentList = callExpression.getArgumentList();
if (actualArg != null && argumentList != null) {
@@ -34,8 +34,7 @@ public interface JavaParameterInfo extends ParameterInfo {
PsiExpression getValue(PsiCallExpression callExpression);
@Nullable
@Override
default PsiElement getActualValue(PsiElement callExpression) {
default PsiElement getActualValue(PsiElement callExpression, Object substitutor) {
return callExpression instanceof PsiCallExpression ? getValue((PsiCallExpression)callExpression) : null;
}
@@ -32,20 +32,19 @@ import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.changeSignature.ParameterInfoImpl;
import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectClassDescriptor;
import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectDelegate;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParameterObjectClassDescriptor<PsiMethod, ParameterInfoImpl> {
private static final Logger LOG = Logger.getInstance("#" + JavaIntroduceParameterObjectClassDescriptor.class.getName());
private final Set<PsiTypeParameter> myTypeParameters = new HashSet<>();
private final Set<PsiTypeParameter> myTypeParameters = new LinkedHashSet<>();
private final Map<ParameterInfoImpl, ParameterBean> myExistingClassProperties = new HashMap<>();
private final MoveDestination myMoveDestination;
@@ -106,12 +105,7 @@ public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParame
public String createFakeClassTypeText() {
String text = StringUtil.getQualifiedName(getPackageName(), getClassName());
if (!myTypeParameters.isEmpty()) {
text += "<" + StringUtil.join(myTypeParameters, new Function<PsiTypeParameter, String>() {
@Override
public String fun(PsiTypeParameter parameter) {
return parameter.getName();
}
}, ", ") + ">";
text += "<" + StringUtil.join(myTypeParameters, PsiNamedElement::getName, ", ") + ">";
}
return text;
}
@@ -22,6 +22,7 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.impl.PsiDiamondTypeUtil;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
@@ -42,6 +43,7 @@ import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -86,9 +88,9 @@ public class JavaIntroduceParameterObjectDelegate
return new ParameterInfoImpl(-1, paramName, facade.getElementFactory().createTypeFromText(classTypeText, method), null) {
@Nullable
@Override
public PsiElement getActualValue(PsiElement exp) {
public PsiElement getActualValue(PsiElement exp, Object substitutor) {
final IntroduceParameterObjectDelegate<PsiNamedElement, ParameterInfo, IntroduceParameterObjectClassDescriptor<PsiNamedElement, ParameterInfo>> delegate = findDelegate(exp);
return delegate != null ? delegate.createNewParameterInitializerAtCallSite(exp, descriptor, oldMethodParameters) : null;
return delegate != null ? delegate.createNewParameterInitializerAtCallSite(exp, descriptor, oldMethodParameters, substitutor) : null;
}
};
}
@@ -96,7 +98,8 @@ public class JavaIntroduceParameterObjectDelegate
@Override
public PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression,
IntroduceParameterObjectClassDescriptor descriptor,
List<? extends ParameterInfo> oldMethodParameters) {
List<? extends ParameterInfo> oldMethodParameters,
Object substitutor) {
if (callExpression instanceof PsiCallExpression) {
final PsiCallExpression expr = (PsiCallExpression)callExpression;
final JavaPsiFacade facade = JavaPsiFacade.getInstance(expr.getProject());
@@ -109,16 +112,31 @@ public class JavaIntroduceParameterObjectDelegate
final PsiExpression[] args = argumentList.getExpressions();
StringBuilder newExpression = new StringBuilder();
final JavaResolveResult resolvant = expr.resolveMethodGenerics();
final PsiSubstitutor substitutor = resolvant.getSubstitutor();
newExpression.append("new ")
.append(JavaPsiFacade.getElementFactory(expr.getProject()).createType(existingClass, substitutor).getCanonicalText());
newExpression.append("new ").append(existingClass.getQualifiedName());
if (descriptor instanceof JavaIntroduceParameterObjectClassDescriptor) {
List<String> types = new ArrayList<>();
for (PsiTypeParameter parameter : ((JavaIntroduceParameterObjectClassDescriptor)descriptor).getTypeParameters()) {
PsiType type = ((PsiSubstitutor)substitutor).substitute(parameter);
if (type == null) {
types.clear();
break;
}
types.add(type.getCanonicalText());
}
if (!types.isEmpty()) {
newExpression.append("<").append(StringUtil.join(types, ", ")).append(">");
}
}
newExpression.append('(');
newExpression.append(getMergedArgs(descriptor, oldMethodParameters, args));
newExpression.append(')');
return JavaCodeStyleManager.getInstance(callExpression.getProject())
PsiNewExpression newClassExpression = (PsiNewExpression)JavaCodeStyleManager.getInstance(callExpression.getProject())
.shortenClassReferences(facade.getElementFactory().createExpressionFromText(newExpression.toString(), expr));
if (PsiDiamondTypeUtil.canChangeContextForDiamond(newClassExpression, newClassExpression.getType())) {
PsiDiamondTypeUtil.replaceExplicitWithDiamond(newClassExpression.getClassOrAnonymousClassReference().getParameterList());
}
return newClassExpression;
}
return null;
}