From 249410f100fe016d321e808908831217da6e414d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 8 Aug 2019 10:19:18 +0700 Subject: [PATCH] InlineMethodProcessor#inlineMethodCall: fix initializer inlining for trivial method body (IDEA-220028) GitOrigin-RevId: 3bbc430022e3933aaa89b31689a121b9617f25ba --- .../inline/InlineMethodProcessor.java | 37 +++++++++++-------- .../inlineMethod/EnumStaticMethod.java | 14 +++++++ .../inlineMethod/EnumStaticMethod.java.after | 11 ++++++ .../refactoring/inline/InlineMethodTest.java | 4 ++ 4 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 9520905468e1..78cb448e990e 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -627,22 +627,17 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { ChangeContextUtil.encodeContextInfo(returnExpr, true); PsiElement copy = returnExpr.copy(); ChangeContextUtil.clearContextInfo(returnExpr); - copy.accept(new JavaRecursiveElementVisitor() { - @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - PsiElement resolve = expression.resolve(); - if (resolve instanceof PsiParameter) { - int paramIdx = ArrayUtil.find(myMethod.getParameterList().getParameters(), resolve); - if (paramIdx >= 0) { - PsiExpression initializer = blockData.parmVars[paramIdx].getInitializer(); - if (initializer != null) { - inlineInitializer((PsiVariable)resolve, initializer, expression); - } - } + if (copy instanceof PsiReferenceExpression && ((PsiReferenceExpression)copy).getQualifierExpression() == null) { + copy = inlineParameterReference((PsiReferenceExpression)copy, blockData); + } else { + copy.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + super.visitReferenceExpression(expression); + inlineParameterReference(expression, blockData); } - } - }); + }); + } PsiElement replace = methodCall.replace(copy); if (blockData.thisVar != null) { ChangeContextUtil.decodeContextInfo(replace, myMethod.getContainingClass(), blockData.thisVar.getInitializer()); @@ -744,6 +739,18 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { ChangeContextUtil.clearContextInfo(anchorParent); } + @NotNull + private PsiExpression inlineParameterReference(@NotNull PsiReferenceExpression expression, BlockData blockData) { + if (expression.getQualifierExpression() != null) return expression; + PsiElement resolve = expression.resolve(); + if (!(resolve instanceof PsiParameter)) return expression; + int paramIdx = ArrayUtil.find(myMethod.getParameterList().getParameters(), resolve); + if (paramIdx < 0) return expression; + PsiExpression initializer = blockData.parmVars[paramIdx].getInitializer(); + if (initializer == null) return expression; + return inlineInitializer((PsiVariable)resolve, initializer, expression); + } + private PsiSubstitutor getCallSubstitutor(PsiMethodCallExpression methodCall) { JavaResolveResult resolveResult = methodCall.getMethodExpression().advancedResolve(false); if (myMethod.isPhysical()) { diff --git a/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java b/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java new file mode 100644 index 000000000000..31c7e7c8ed1b --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java @@ -0,0 +1,14 @@ + +enum A { + A(foo("a")), + B(foo("b")), + C(foo("c")), + ; + + A(final String c) { + } + + private static String foo(String x) { + return x; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java.after b/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java.after new file mode 100644 index 000000000000..82b00ccd1a42 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/EnumStaticMethod.java.after @@ -0,0 +1,11 @@ + +enum A { + A("a"), + B("b"), + C("c"), + ; + + A(final String c) { + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java index ae5aee250d1f..883334e80735 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java @@ -539,6 +539,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTest(); } + public void testEnumStaticMethod() { + doTest(); + } + @Override protected Sdk getProjectJDK() { return getTestName(false).contains("Src") ? IdeaTestUtil.getMockJdk17() : super.getProjectJDK();