mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
introduce param object: pass substitution around which won't be available after method signature is changed (IDEA-154208)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-12
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-9
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-8
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user