From 0141c9937155fa6a46d4b87b192f915e556547a8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 23 May 2018 12:43:24 +0300 Subject: [PATCH] make method static: fix method refs in method body EA-120553 - assert: MakeMethodStaticProcessor.changeSelfUsage --- .../makeStatic/MakeMethodStaticProcessor.java | 41 +++++++++++++++---- .../afterMethodReferenceInTheSameMethod.java | 13 ++++++ .../beforeMethodReferenceInTheSameMethod.java | 13 ++++++ .../refactoring/MakeMethodStaticTest.java | 4 ++ 4 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/makeMethodStatic/afterMethodReferenceInTheSameMethod.java create mode 100644 java/java-tests/testData/refactoring/makeMethodStatic/beforeMethodReferenceInTheSameMethod.java 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 d75197817f3b..26bd3b0f97a1 100644 --- a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java @@ -96,8 +96,25 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< } protected void changeSelfUsage(SelfUsageInfo usageInfo) throws IncorrectOperationException { - PsiElement parent = usageInfo.getElement().getParent(); - LOG.assertTrue(parent instanceof PsiMethodCallExpression); + PsiElement element = usageInfo.getElement(); + PsiElement parent = element.getParent(); + if (element instanceof PsiMethodReferenceExpression) { + if (needLambdaConversion((PsiMethodReferenceExpression)element)) { + PsiMethodCallExpression methodCallExpression = getMethodCallExpression((PsiMethodReferenceExpression)element); + if (methodCallExpression == null) return; + parent = methodCallExpression; + } + else { + PsiElementFactory factory = JavaPsiFacade.getElementFactory(parent.getProject()); + PsiClass memberClass = myMember.getContainingClass(); + LOG.assertTrue(memberClass != null); + PsiElement qualifier = ((PsiMethodReferenceExpression)element).getQualifier(); + LOG.assertTrue(qualifier != null); + qualifier.replace(factory.createReferenceExpression(memberClass)); + return; + } + } + LOG.assertTrue(parent instanceof PsiMethodCallExpression, parent); PsiMethodCallExpression methodCall = (PsiMethodCallExpression) parent; final PsiExpression qualifier = methodCall.getMethodExpression().getQualifierExpression(); if (qualifier != null) qualifier.delete(); @@ -271,13 +288,9 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< 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(); + PsiMethodCallExpression expression = getMethodCallExpression((PsiMethodReferenceExpression)methodRef); + if (expression == null) return; + methodRef = expression.getMethodExpression(); } PsiElement parent = methodRef.getParent(); @@ -359,6 +372,16 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< } } + private static PsiMethodCallExpression getMethodCallExpression(PsiMethodReferenceExpression methodRef) { + PsiLambdaExpression lambdaExpression = + LambdaRefactoringUtil.convertMethodReferenceToLambda(methodRef, true, true); + List returnExpressions = LambdaUtil.getReturnExpressions(lambdaExpression); + if (returnExpressions.size() != 1) return null; + PsiExpression expression = returnExpressions.get(0); + if (!(expression instanceof PsiMethodCallExpression)) return null; + return (PsiMethodCallExpression)expression; + } + private boolean needLambdaConversion(PsiMethodReferenceExpression methodRef) { if (mySettings.isMakeFieldParameters()) { return true; diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/afterMethodReferenceInTheSameMethod.java b/java/java-tests/testData/refactoring/makeMethodStatic/afterMethodReferenceInTheSameMethod.java new file mode 100644 index 000000000000..13e2b606e863 --- /dev/null +++ b/java/java-tests/testData/refactoring/makeMethodStatic/afterMethodReferenceInTheSameMethod.java @@ -0,0 +1,13 @@ +import java.util.List; +import java.util.function.BiConsumer; + +class IWalker { + public static void walk(I e) { + e.getChildren().forEach(IWalker::walk); + final BiConsumer walk = (iWalker, e1) -> IWalker.walk(e1); + } + + interface I { + List getChildren(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/beforeMethodReferenceInTheSameMethod.java b/java/java-tests/testData/refactoring/makeMethodStatic/beforeMethodReferenceInTheSameMethod.java new file mode 100644 index 000000000000..ea6a8b42a76b --- /dev/null +++ b/java/java-tests/testData/refactoring/makeMethodStatic/beforeMethodReferenceInTheSameMethod.java @@ -0,0 +1,13 @@ +import java.util.List; +import java.util.function.BiConsumer; + +class IWalker { + public void walk(I e) { + e.getChildren().forEach(this::walk); + final BiConsumer walk = IWalker::walk; + } + + interface I { + List getChildren(); + } +} \ 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 ebec91b47de9..10ad5ccea860 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 testMethodReferenceInTheSameMethod() { + doTest(false); + } + public void testExpandMethodReference() { doTest(true); }