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
2016-04-25 10:57:40 +02:00
parent d9288e4b42
commit 1ce6f8d2fa
15 changed files with 107 additions and 50 deletions
@@ -309,7 +309,7 @@ public class JavaChangeInfoImpl extends UserDataHolderBase implements JavaChange
@Nullable @Nullable
public PsiExpression getValue(int i, PsiCallExpression expr) throws IncorrectOperationException { public PsiExpression getValue(int i, PsiCallExpression expr) throws IncorrectOperationException {
if (defaultValues[i] != null) return defaultValues[i]; 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; 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 //This methods works equally well for primary usages as well as for propagated callers' usages
private static void fixActualArgumentsList(PsiExpressionList list, private static void fixActualArgumentsList(PsiExpressionList list,
JavaChangeInfo changeInfo, JavaChangeInfo changeInfo,
boolean toInsertDefaultValue, PsiSubstitutor substitutor) throws IncorrectOperationException { boolean toInsertDefaultValue,
PsiSubstitutor substitutor) throws IncorrectOperationException {
final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory(); final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory();
if (changeInfo.isParameterSetOrOrderChanged()) { if (changeInfo.isParameterSetOrOrderChanged()) {
if (changeInfo instanceof JavaChangeInfoImpl && ((JavaChangeInfoImpl)changeInfo).isPropagationEnabled) { if (changeInfo instanceof JavaChangeInfoImpl && ((JavaChangeInfoImpl)changeInfo).isPropagationEnabled) {
@@ -418,7 +419,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
for (ParameterInfoImpl info : createdParmsInfo) { for (ParameterInfoImpl info : createdParmsInfo) {
PsiExpression newArg; PsiExpression newArg;
if (toInsertDefaultValue) { if (toInsertDefaultValue) {
newArg = createDefaultValue(changeInfo, factory, info, list); newArg = createDefaultValue(changeInfo, factory, info, list, substitutor);
} }
else { else {
newArg = factory.createExpressionFromText(info.getName(), list); newArg = factory.createExpressionFromText(info.getName(), list);
@@ -486,12 +487,12 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
continue; continue;
} }
} }
newArgs[i] = createActualArgument(changeInfo, list, newParms[i], toInsertDefaultValue, args); newArgs[i] = createActualArgument(changeInfo, list, newParms[i], toInsertDefaultValue, args, substitutor);
} }
if (changeInfo.isArrayToVarargs()) { if (changeInfo.isArrayToVarargs()) {
if (newVarargInitializers == null) { if (newVarargInitializers == null) {
newArgs[newNonVarargCount] = newArgs[newNonVarargCount] =
createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args); createActualArgument(changeInfo, list, newParms[newNonVarargCount], toInsertDefaultValue, args, substitutor);
} }
else { else {
System.arraycopy(newVarargInitializers, 0, newArgs, newNonVarargCount, newVarargInitializers.length); System.arraycopy(newVarargInitializers, 0, newArgs, newNonVarargCount, newVarargInitializers.length);
@@ -503,7 +504,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
for (int i = newNonVarargCount; i < newArgsLength; i++){ for (int i = newNonVarargCount; i < newArgsLength; i++){
final int oldIndex = newParms[newNonVarargCount].getOldIndex(); final int oldIndex = newParms[newNonVarargCount].getOldIndex();
if (oldIndex >= 0 && oldIndex != nonVarargCount) { 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 { } else {
System.arraycopy(args, nonVarargCount, newArgs, newNonVarargCount, newVarargCount); System.arraycopy(args, nonVarargCount, newArgs, newNonVarargCount, newVarargCount);
break; break;
@@ -526,7 +527,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
final PsiExpressionList list, final PsiExpressionList list,
final JavaParameterInfo info, final JavaParameterInfo info,
final boolean toInsertDefaultValue, final boolean toInsertDefaultValue,
final PsiExpression[] args) throws IncorrectOperationException { final PsiExpression[] args,
PsiSubstitutor substitutor) throws IncorrectOperationException {
final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory(); final PsiElementFactory factory = JavaPsiFacade.getInstance(list.getProject()).getElementFactory();
final int index = info.getOldIndex(); final int index = info.getOldIndex();
if (index >= 0 && index < args.length) { if (index >= 0 && index < args.length) {
@@ -534,7 +536,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
} }
else { else {
if (toInsertDefaultValue) { if (toInsertDefaultValue) {
return createDefaultValue(changeInfo, factory, info, list); return createDefaultValue(changeInfo, factory, info, list, substitutor);
} }
else { else {
return factory.createExpressionFromText(info.getName(), list); return factory.createExpressionFromText(info.getName(), list);
@@ -546,7 +548,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
private static PsiExpression createDefaultValue(JavaChangeInfo changeInfo, private static PsiExpression createDefaultValue(JavaChangeInfo changeInfo,
final PsiElementFactory factory, final PsiElementFactory factory,
final JavaParameterInfo info, final JavaParameterInfo info,
final PsiExpressionList list) final PsiExpressionList list, PsiSubstitutor substitutor)
throws IncorrectOperationException { throws IncorrectOperationException {
if (info.isUseAnySingleVariable()) { if (info.isUseAnySingleVariable()) {
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(list.getProject()).getResolveHelper(); 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 PsiCallExpression callExpression = PsiTreeUtil.getParentOfType(list, PsiCallExpression.class);
final String defaultValue = info.getDefaultValue(); 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; : !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 { private static void addDelegateArguments(JavaChangeInfo changeInfo, PsiElementFactory factory, final PsiCallExpression callExpression) throws IncorrectOperationException {
final JavaParameterInfo[] newParms = changeInfo.getNewParameters(); final JavaParameterInfo[] newParms = changeInfo.getNewParameters();
final String[] oldParameterNames = changeInfo.getOldParameterNames(); final String[] oldParameterNames = changeInfo.getOldParameterNames();
for (int i = 0; i < newParms.length; i++) { for (JavaParameterInfo newParm : newParms) {
JavaParameterInfo newParm = newParms[i];
final PsiExpression actualArg; final PsiExpression actualArg;
if (newParm.getOldIndex() >= 0) { if (newParm.getOldIndex() >= 0) {
actualArg = factory.createExpressionFromText(oldParameterNames[newParm.getOldIndex()], callExpression); actualArg = factory.createExpressionFromText(oldParameterNames[newParm.getOldIndex()], callExpression);
} }
else { else {
actualArg = (PsiExpression)changeInfo.getActualValue(i, callExpression); actualArg = (PsiExpression)newParm.getActualValue(callExpression, PsiSubstitutor.EMPTY);
} }
final PsiExpressionList argumentList = callExpression.getArgumentList(); final PsiExpressionList argumentList = callExpression.getArgumentList();
if (actualArg != null && argumentList != null) { if (actualArg != null && argumentList != null) {
@@ -34,8 +34,7 @@ public interface JavaParameterInfo extends ParameterInfo {
PsiExpression getValue(PsiCallExpression callExpression); PsiExpression getValue(PsiCallExpression callExpression);
@Nullable @Nullable
@Override default PsiElement getActualValue(PsiElement callExpression, Object substitutor) {
default PsiElement getActualValue(PsiElement callExpression) {
return callExpression instanceof PsiCallExpression ? getValue((PsiCallExpression)callExpression) : null; 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.changeSignature.ParameterInfoImpl;
import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectClassDescriptor; import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectClassDescriptor;
import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectDelegate; import com.intellij.refactoring.introduceParameterObject.IntroduceParameterObjectDelegate;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.HashSet; import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParameterObjectClassDescriptor<PsiMethod, ParameterInfoImpl> { public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParameterObjectClassDescriptor<PsiMethod, ParameterInfoImpl> {
private static final Logger LOG = Logger.getInstance("#" + JavaIntroduceParameterObjectClassDescriptor.class.getName()); 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 Map<ParameterInfoImpl, ParameterBean> myExistingClassProperties = new HashMap<>();
private final MoveDestination myMoveDestination; private final MoveDestination myMoveDestination;
@@ -106,12 +105,7 @@ public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParame
public String createFakeClassTypeText() { public String createFakeClassTypeText() {
String text = StringUtil.getQualifiedName(getPackageName(), getClassName()); String text = StringUtil.getQualifiedName(getPackageName(), getClassName());
if (!myTypeParameters.isEmpty()) { if (!myTypeParameters.isEmpty()) {
text += "<" + StringUtil.join(myTypeParameters, new Function<PsiTypeParameter, String>() { text += "<" + StringUtil.join(myTypeParameters, PsiNamedElement::getName, ", ") + ">";
@Override
public String fun(PsiTypeParameter parameter) {
return parameter.getName();
}
}, ", ") + ">";
} }
return text; return text;
} }
@@ -22,6 +22,7 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.impl.PsiDiamondTypeUtil;
import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
@@ -42,6 +43,7 @@ import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.MultiMap; import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -86,9 +88,9 @@ public class JavaIntroduceParameterObjectDelegate
return new ParameterInfoImpl(-1, paramName, facade.getElementFactory().createTypeFromText(classTypeText, method), null) { return new ParameterInfoImpl(-1, paramName, facade.getElementFactory().createTypeFromText(classTypeText, method), null) {
@Nullable @Nullable
@Override @Override
public PsiElement getActualValue(PsiElement exp) { public PsiElement getActualValue(PsiElement exp, Object substitutor) {
final IntroduceParameterObjectDelegate<PsiNamedElement, ParameterInfo, IntroduceParameterObjectClassDescriptor<PsiNamedElement, ParameterInfo>> delegate = findDelegate(exp); 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 @Override
public PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression, public PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression,
IntroduceParameterObjectClassDescriptor descriptor, IntroduceParameterObjectClassDescriptor descriptor,
List<? extends ParameterInfo> oldMethodParameters) { List<? extends ParameterInfo> oldMethodParameters,
Object substitutor) {
if (callExpression instanceof PsiCallExpression) { if (callExpression instanceof PsiCallExpression) {
final PsiCallExpression expr = (PsiCallExpression)callExpression; final PsiCallExpression expr = (PsiCallExpression)callExpression;
final JavaPsiFacade facade = JavaPsiFacade.getInstance(expr.getProject()); final JavaPsiFacade facade = JavaPsiFacade.getInstance(expr.getProject());
@@ -109,16 +112,31 @@ public class JavaIntroduceParameterObjectDelegate
final PsiExpression[] args = argumentList.getExpressions(); final PsiExpression[] args = argumentList.getExpressions();
StringBuilder newExpression = new StringBuilder(); StringBuilder newExpression = new StringBuilder();
final JavaResolveResult resolvant = expr.resolveMethodGenerics(); newExpression.append("new ").append(existingClass.getQualifiedName());
final PsiSubstitutor substitutor = resolvant.getSubstitutor(); if (descriptor instanceof JavaIntroduceParameterObjectClassDescriptor) {
newExpression.append("new ") List<String> types = new ArrayList<>();
.append(JavaPsiFacade.getElementFactory(expr.getProject()).createType(existingClass, substitutor).getCanonicalText()); 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('(');
newExpression.append(getMergedArgs(descriptor, oldMethodParameters, args)); newExpression.append(getMergedArgs(descriptor, oldMethodParameters, args));
newExpression.append(')'); newExpression.append(')');
return JavaCodeStyleManager.getInstance(callExpression.getProject()) PsiNewExpression newClassExpression = (PsiNewExpression)JavaCodeStyleManager.getInstance(callExpression.getProject())
.shortenClassReferences(facade.getElementFactory().createExpressionFromText(newExpression.toString(), expr)); .shortenClassReferences(facade.getElementFactory().createExpressionFromText(newExpression.toString(), expr));
if (PsiDiamondTypeUtil.canChangeContextForDiamond(newClassExpression, newClassExpression.getType())) {
PsiDiamondTypeUtil.replaceExplicitWithDiamond(newClassExpression.getClassOrAnonymousClassReference().getParameterList());
}
return newClassExpression;
} }
return null; return null;
} }
@@ -0,0 +1,13 @@
import java.util.List;
public class Param<T> {
private final List<T> y;
public Param(List<T> y) {
this.y = y;
}
public List<T> getY() {
return y;
}
}
@@ -0,0 +1,11 @@
import java.util.List;
public class Test {
public static <T> String foo(Param<T> param) {
return null;
}
void bar(List<Integer> list) {
System.out.println(foo(new Param<>(list)));
}
}
@@ -0,0 +1,12 @@
import java.util.Collection;
import java.util.List;
public class Test {
public static <T> String foo(List<T> y) {
return null;
}
void bar(List<Integer> list) {
System.out.println(foo(list));
}
}
@@ -22,7 +22,9 @@ package com.intellij.refactoring;
import com.intellij.JavaTestUtil; import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.changeSignature.JavaMethodDescriptor; import com.intellij.refactoring.changeSignature.JavaMethodDescriptor;
@@ -132,6 +134,18 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{
doTest(); doTest();
} }
public void testTypeParametersWithSubstitution() throws Exception {
final LanguageLevelProjectExtension projectExtension = LanguageLevelProjectExtension.getInstance(getProject());
final LanguageLevel oldLevel = projectExtension.getLanguageLevel();
try {
projectExtension.setLanguageLevel(LanguageLevel.HIGHEST);
doTest();
}
finally {
projectExtension.setLanguageLevel(oldLevel);
}
}
public void testSameTypeAndVarargs() throws Exception { public void testSameTypeAndVarargs() throws Exception {
doTest(false, false, method -> { doTest(false, false, method -> {
final PsiParameter[] parameters = method.getParameterList().getParameters(); final PsiParameter[] parameters = method.getParameterList().getParameters();
@@ -52,13 +52,4 @@ public interface ChangeInfo {
String getNewName(); String getNewName();
Language getLanguage(); Language getLanguage();
/**
* For added parameters, return expression to be inserted as argument at the parameter position in callExpression.
* Based on parameter default value {@link ParameterInfo#getActualValue(PsiElement)}
*/
default PsiElement getActualValue(int i, PsiElement callExpression) {
final ParameterInfo[] parameters = getNewParameters();
return i < parameters.length ? parameters[i].getActualValue(callExpression) : null;
}
} }
@@ -55,7 +55,7 @@ public interface ParameterInfo {
* Could be overridden to provide values which depend on the call site * Could be overridden to provide values which depend on the call site
*/ */
@Nullable @Nullable
default PsiElement getActualValue(PsiElement callExpression) { default PsiElement getActualValue(PsiElement callExpression, Object substitutor) {
return null; return null;
} }
@@ -100,10 +100,12 @@ public abstract class IntroduceParameterObjectDelegate<M extends PsiNamedElement
/** /**
* Call site should be updated according to the selected parameters, which correspond to the parameters to merge ({@link IntroduceParameterObjectClassDescriptor#getParamsToMerge()}) * Call site should be updated according to the selected parameters, which correspond to the parameters to merge ({@link IntroduceParameterObjectClassDescriptor#getParamsToMerge()})
* E.g. for the call foo(a, b, c) and parameter class which corresponds to the first 2 parameters, actual value should represent foo(new P(a, b), c) * E.g. for the call foo(a, b, c) and parameter class which corresponds to the first 2 parameters, actual value should represent foo(new P(a, b), c)
* @param substitutor should contain call substitutor before change signature replaced parameters
*/ */
public abstract PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression, public abstract PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression,
IntroduceParameterObjectClassDescriptor descriptor, IntroduceParameterObjectClassDescriptor descriptor,
List<? extends ParameterInfo> oldMethodParameters); List<? extends ParameterInfo> oldMethodParameters,
Object substitutor);
/** /**
* Pass new parameter infos to the change info constructor which corresponds to the language of this delegate * Pass new parameter infos to the change info constructor which corresponds to the language of this delegate
@@ -336,7 +336,7 @@ public class GrChangeInfoImpl implements JavaChangeInfo {
@Override @Override
public PsiExpression getValue(int i, PsiCallExpression callExpression) { public PsiExpression getValue(int i, PsiCallExpression callExpression) {
if (defaultValues[i] != null) return defaultValues[i]; if (defaultValues[i] != null) return defaultValues[i];
final PsiElement valueAtCallSite = parameters.get(i).getActualValue(callExpression); final PsiElement valueAtCallSite = parameters.get(i).getActualValue(callExpression, PsiSubstitutor.EMPTY);
return valueAtCallSite instanceof PsiExpression ? (PsiExpression)valueAtCallSite : null; return valueAtCallSite instanceof PsiExpression ? (PsiExpression)valueAtCallSite : null;
} }
@@ -529,7 +529,7 @@ public class GrChangeSignatureUsageProcessor implements ChangeSignatureUsageProc
argsToDelete.removeAll(map[index].args); argsToDelete.removeAll(map[index].args);
} }
else { else {
values[i] = createDefaultValue(factory, changeInfo, parameter, argumentList); values[i] = createDefaultValue(factory, changeInfo, parameter, argumentList, substitutor);
} }
} }
@@ -640,7 +640,8 @@ public class GrChangeSignatureUsageProcessor implements ChangeSignatureUsageProc
private static GrExpression createDefaultValue(GroovyPsiElementFactory factory, private static GrExpression createDefaultValue(GroovyPsiElementFactory factory,
JavaChangeInfo changeInfo, JavaChangeInfo changeInfo,
JavaParameterInfo info, JavaParameterInfo info,
final GrArgumentList list) { final GrArgumentList list,
PsiSubstitutor substitutor) {
if (info.isUseAnySingleVariable()) { if (info.isUseAnySingleVariable()) {
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(list.getProject()).getResolveHelper(); final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(list.getProject()).getResolveHelper();
final PsiType type = info.getTypeWrapper().getType(changeInfo.getMethod(), list.getManager()); final PsiType type = info.getTypeWrapper().getType(changeInfo.getMethod(), list.getManager());
@@ -689,7 +690,7 @@ public class GrChangeSignatureUsageProcessor implements ChangeSignatureUsageProc
} }
} }
final PsiElement element = info.getActualValue(list.getParent()); final PsiElement element = info.getActualValue(list.getParent(), substitutor);
if (element instanceof GrExpression) { if (element instanceof GrExpression) {
return (GrExpression)element; return (GrExpression)element;
} }
@@ -76,10 +76,10 @@ public class GroovyIntroduceParameterObjectDelegate
return new GrParameterInfo(descriptor.getClassName(), null, null, classType, -1, false) { return new GrParameterInfo(descriptor.getClassName(), null, null, classType, -1, false) {
@Nullable @Nullable
@Override @Override
public PsiElement getActualValue(PsiElement callExpression) { public PsiElement getActualValue(PsiElement callExpression, Object substitutor) {
final IntroduceParameterObjectDelegate<PsiNamedElement, ParameterInfo, IntroduceParameterObjectClassDescriptor<PsiNamedElement, ParameterInfo>> final IntroduceParameterObjectDelegate<PsiNamedElement, ParameterInfo, IntroduceParameterObjectClassDescriptor<PsiNamedElement, ParameterInfo>>
delegate = findDelegate(callExpression); delegate = findDelegate(callExpression);
return delegate != null ? delegate.createNewParameterInitializerAtCallSite(callExpression, descriptor, oldMethodParameters) : null; return delegate != null ? delegate.createNewParameterInitializerAtCallSite(callExpression, descriptor, oldMethodParameters, substitutor) : null;
} }
}; };
} }
@@ -87,7 +87,8 @@ public class GroovyIntroduceParameterObjectDelegate
@Override @Override
public PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression, public PsiElement createNewParameterInitializerAtCallSite(PsiElement callExpression,
IntroduceParameterObjectClassDescriptor descriptor, IntroduceParameterObjectClassDescriptor descriptor,
List<? extends ParameterInfo> oldMethodParameters) { List<? extends ParameterInfo> oldMethodParameters,
Object substitutor) {
if (callExpression instanceof GrCallExpression) { if (callExpression instanceof GrCallExpression) {
final GrArgumentList list = ((GrCallExpression)callExpression).getArgumentList(); final GrArgumentList list = ((GrCallExpression)callExpression).getArgumentList();
if (list == null) { if (list == null) {