From 61816006f625aedcbcca780b60c1b958c5255f88 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 25 Feb 2016 15:20:58 +0100 Subject: [PATCH] introduce parameter: expand method reference to lambda when new parameter introduced (IDEA-152125) --- ...vaIntroduceParameterMethodUsagesProcessor.java | 15 +++++++++++++-- .../refactoring/util/RefactoringUtil.java | 2 +- .../afterExpandMethodReference.java | 13 +++++++++++++ .../beforeExpandMethodReference.java | 14 ++++++++++++++ .../refactoring/IntroduceParameterTest.java | 4 ++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java create mode 100644 java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java index e44a135b7669..e6df8fc4d06b 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java @@ -31,6 +31,7 @@ import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.FieldConflictsResolver; +import com.intellij.refactoring.util.LambdaRefactoringUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper; import com.intellij.usageView.UsageInfo; @@ -60,8 +61,18 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar } public boolean processChangeMethodUsage(IntroduceParameterData data, UsageInfo usage, UsageInfo[] usages) throws IncorrectOperationException { - if (!isMethodUsage(usage)) return true; - final PsiElement ref = usage.getElement(); + PsiElement ref = usage.getElement(); + if (ref instanceof PsiMethodReferenceExpression) { + final PsiLambdaExpression lambdaExpression = LambdaRefactoringUtil.convertMethodReferenceToLambda((PsiMethodReferenceExpression)ref, false, true); + final PsiExpression callExpression = LambdaUtil.extractSingleExpressionFromBody(lambdaExpression.getBody()); + if (callExpression == null) { + return true; + } + ref = callExpression; + } + else if (!isMethodUsage(usage)) { + return true; + } PsiCall callExpression = RefactoringUtil.getCallExpressionByMethodReference(ref); PsiExpressionList argList = RefactoringUtil.getArgumentListByMethodReference(ref); if (argList == null) return true; diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 822efd705c80..f9d723d81e97 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -559,7 +559,7 @@ public class RefactoringUtil { } public static PsiCall getCallExpressionByMethodReference(PsiElement ref) { - if (ref instanceof PsiEnumConstant) return (PsiCall)ref; + if (ref instanceof PsiCall) return (PsiCall)ref; PsiElement parent = ref.getParent(); if (parent instanceof PsiMethodCallExpression) { return (PsiMethodCallExpression)parent; diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java new file mode 100644 index 000000000000..bbb2740317b2 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java @@ -0,0 +1,13 @@ +interface I { + boolean m(int a); +} + +class A { + { + I predicate = (a) -> A.alwaysTrue(a, ""); + } + + private static boolean alwaysTrue(int a, String anObject) { + return true; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java b/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java new file mode 100644 index 000000000000..bbde7ca43cbd --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeExpandMethodReference.java @@ -0,0 +1,14 @@ +interface I { + boolean m(int a); +} + +class A { + { + I predicate = A::alwaysTrue; + } + + private static boolean alwaysTrue(int a) { + "" + return true; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java index 0a83def598b7..77cb593f30b9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java @@ -142,6 +142,10 @@ public class IntroduceParameterTest extends LightRefactoringTestCase { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false); } + public void testExpandMethodReference() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false); + } + public void testSuperWithSideEffect() { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, false, false, "Parameter initializer contains super, but not all calls to method are in its class");