change signature: don't expand method reference if parameters/exceptions were not changed (IDEA-152116); support method rename through change signature

This commit is contained in:
Anna Kozlova
2016-02-24 21:05:13 +01:00
parent aa00a3b1ba
commit 8e5d9f60af
7 changed files with 65 additions and 7 deletions
@@ -110,9 +110,9 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
}
return true;
}
else if (usage instanceof MethodReferenceUsageInfo) {
else if (usage instanceof MethodReferenceUsageInfo && MethodReferenceUsageInfo.needToExpand((JavaChangeInfo)changeInfo)) {
final PsiElement element = usage.getElement();
if (element instanceof PsiMethodReferenceExpression) {
if (element instanceof PsiMethodReferenceExpression ) {
final PsiLambdaExpression lambdaExpression = LambdaRefactoringUtil.convertMethodReferenceToLambda((PsiMethodReferenceExpression)element, false, true);
final PsiExpression expression = LambdaUtil.extractSingleExpressionFromBody(lambdaExpression.getBody());
if (expression instanceof PsiCallExpression) {
@@ -163,7 +163,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
addDefaultConstructor(((JavaChangeInfo)changeInfo), ((NoConstructorClassUsageInfo)usage).getPsiClass(), usages);
return true;
}
else if (usage instanceof MethodReferenceUsageInfo) {
else if (usage instanceof MethodReferenceUsageInfo && MethodReferenceUsageInfo.needToExpand((JavaChangeInfo)changeInfo)) {
final MethodCallUsageInfo methodCallInfo = ((MethodReferenceUsageInfo)usage).createMethodCallInfo();
if (methodCallInfo != null) {
processMethodUsage(methodCallInfo.getElement(), (JavaChangeInfo)changeInfo, methodCallInfo.isToChangeArguments(),
@@ -1006,7 +1006,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
checkContract(conflictDescriptions, method);
}
else if (element instanceof PsiMethodReferenceExpression) {
else if (element instanceof PsiMethodReferenceExpression && MethodReferenceUsageInfo.needToExpand(myChangeInfo)) {
conflictDescriptions.putValue(element, "Changed method is used in method reference. Proceeding would result in conversion to lambda expression");
}
}
@@ -257,7 +257,7 @@ class JavaChangeSignatureUsageSearcher {
else if (ref instanceof PsiCallReference) {
result.add(new CallReferenceUsageInfo((PsiCallReference)ref));
}
else if (element instanceof PsiMethodReferenceExpression) {
else if (element instanceof PsiMethodReferenceExpression && MethodReferenceUsageInfo.needToExpand(myChangeInfo)) {
result.add(new MethodReferenceUsageInfo(element, method, isToModifyArgs, isToCatchExceptions));
}
else {
@@ -37,7 +37,7 @@ class MethodReferenceUsageInfo extends UsageInfo {
public void setCallExpression(PsiCallExpression callExpression) {
myCallExpression = callExpression;
}
@Nullable
public MethodCallUsageInfo createMethodCallInfo() {
if (myCallExpression == null) {
@@ -46,6 +46,10 @@ class MethodReferenceUsageInfo extends UsageInfo {
return new MethodCallUsageInfo(myCallExpression, myIsToModifyArgs, myIsToCatchExceptions);
}
public static boolean needToExpand(JavaChangeInfo changeInfo) {
return !changeInfo.isGenerateDelegate() && (changeInfo.isParameterSetOrOrderChanged() || changeInfo.isExceptionSetOrOrderChanged());
}
@Nullable
@Override
public PsiElement getElement() {
@@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil;
import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession;
@@ -359,7 +360,15 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
@Override
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
return this;
CheckUtil.checkWritable(this);
if (isReferenceTo(element) || !isPhysical()) return this;
if (element instanceof PsiMethod) {
return handleElementRename(((PsiMethod)element).getName());
}
else {
throw new IncorrectOperationException(element.toString());
}
}
@Override
@@ -0,0 +1,20 @@
import java.util.ArrayList;
import java.util.List;
interface P {
boolean m(Integer i);
}
class A {
public static void print() {
List<Integer> someNumbers = A.returnAllNumbers(A::alwaysTrue);
}
private static List<Integer> returnAllNumbers(P predicate) {
return new ArrayList<>();
}
public static boolean alwa<caret>ysTrue(int a) {
return true;
}
}
@@ -0,0 +1,20 @@
import java.util.ArrayList;
import java.util.List;
interface P {
boolean m(Integer i);
}
class A {
public static void print() {
List<Integer> someNumbers = A.returnAllNumbers(A::alwaysFalse);
}
private static List<Integer> returnAllNumbers(P predicate) {
return new ArrayList<>();
}
private static boolean alwaysFalse(int a) {
return true;
}
}
@@ -353,6 +353,11 @@ public class ChangeSignatureTest extends ChangeSignatureBaseTest {
doTest(null, null, null, genParams, new SimpleExceptionsGen(), false, true);
}
public void testRenameMethodUsedInMethodReference() {
GenParams genParams = method -> new ParameterInfoImpl[] {new ParameterInfoImpl(0, "a", PsiType.INT)};
doTest(PsiModifier.PRIVATE, "alwaysFalse", null, genParams, new SimpleExceptionsGen(), false, false);
}
public void testMethodParametersAlignmentAfterMethodNameChange() {
getJavaSettings().ALIGN_MULTILINE_PARAMETERS = true;
getJavaSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true;