mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+4
-4
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+5
-1
@@ -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() {
|
||||
|
||||
+10
-1
@@ -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
|
||||
|
||||
+20
@@ -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;
|
||||
}
|
||||
}
|
||||
+20
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user