diff --git a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java index 95912a05bf5b..d75197817f3b 100644 --- a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java @@ -32,6 +32,7 @@ import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.refactoring.changeSignature.ThrownExceptionInfo; import com.intellij.refactoring.changeSignature.inCallers.JavaCallerChooser; import com.intellij.refactoring.util.CanonicalTypes; +import com.intellij.refactoring.util.LambdaRefactoringUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper; import com.intellij.usageView.UsageInfo; @@ -85,12 +86,10 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< @Override protected MultiMap getConflictDescriptions(UsageInfo[] usages) { MultiMap descriptions = super.getConflictDescriptions(usages); - if (mySettings.isMakeClassParameter() || mySettings.isMakeFieldParameters()) { - for (UsageInfo usage : usages) { - PsiElement element = usage.getElement(); - if (element instanceof PsiMethodReferenceExpression) { - descriptions.putValue(element, "Method reference will be corrupted"); - } + for (UsageInfo usage : usages) { + PsiElement element = usage.getElement(); + if (element instanceof PsiMethodReferenceExpression && needLambdaConversion((PsiMethodReferenceExpression)element)) { + descriptions.putValue(element, "Method reference will be converted to lambda"); } } return descriptions; @@ -271,6 +270,15 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< if (!(element instanceof PsiReferenceExpression)) return; PsiReferenceExpression methodRef = (PsiReferenceExpression) element; + if (methodRef instanceof PsiMethodReferenceExpression && needLambdaConversion((PsiMethodReferenceExpression)methodRef)) { + PsiLambdaExpression lambdaExpression = + LambdaRefactoringUtil.convertMethodReferenceToLambda(((PsiMethodReferenceExpression)methodRef), true, true); + List returnExpressions = LambdaUtil.getReturnExpressions(lambdaExpression); + if (returnExpressions.size() != 1) return; + PsiExpression expression = returnExpressions.get(0); + if (!(expression instanceof PsiMethodCallExpression)) return; + methodRef = ((PsiMethodCallExpression)expression).getMethodExpression(); + } PsiElement parent = methodRef.getParent(); PsiExpression instanceRef; @@ -351,6 +359,16 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< } } + private boolean needLambdaConversion(PsiMethodReferenceExpression methodRef) { + if (mySettings.isMakeFieldParameters()) { + return true; + } + if (PsiMethodReferenceUtil.isResolvedBySecondSearch(methodRef)) { + return myMember.getParameters().length != 0 || !mySettings.isMakeClassParameter(); + } + return mySettings.isMakeClassParameter(); + } + protected void findExternalUsages(final ArrayList result) { if (mySettings.isDelegate()) return; findExternalReferences(myMember, result); diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/afterExpandMethodReference.java b/java/java-tests/testData/refactoring/makeMethodStatic/afterExpandMethodReference.java new file mode 100644 index 000000000000..010d9f34988d --- /dev/null +++ b/java/java-tests/testData/refactoring/makeMethodStatic/afterExpandMethodReference.java @@ -0,0 +1,20 @@ +import java.util.function.Function; + +class Foo { + Bar frobnitz(Function f) { + return f.apply(this); + } +} + +class Bar { + static Bar frob(Bar anObject, Foo foo) { + return anObject; + } +} + +class Baz { + public static void main(String[] args) { + Bar bar = new Bar(); + new Foo().frobnitz(foo -> Bar.frob(bar, foo)); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/beforeExpandMethodReference.java b/java/java-tests/testData/refactoring/makeMethodStatic/beforeExpandMethodReference.java new file mode 100644 index 000000000000..aaf17f32993b --- /dev/null +++ b/java/java-tests/testData/refactoring/makeMethodStatic/beforeExpandMethodReference.java @@ -0,0 +1,20 @@ +import java.util.function.Function; + +class Foo { + Bar frobnitz(Function f) { + return f.apply(this); + } +} + +class Bar { + Bar frob(Foo foo) { + return this; + } +} + +class Baz { + public static void main(String[] args) { + Bar bar = new Bar(); + new Foo().frobnitz(bar::frob); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/MakeMethodStaticTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/MakeMethodStaticTest.java index 949591d21ab2..ebec91b47de9 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/MakeMethodStaticTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/MakeMethodStaticTest.java @@ -207,6 +207,10 @@ public class MakeMethodStaticTest extends LightRefactoringTestCase { doTest(false); } + public void testExpandMethodReference() { + doTest(true); + } + public void testPreserveParametersAlignment() { doTest(); }