From a762d39396ede78655c93df6372aafebb737b98a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 11 Nov 2024 14:22:35 +0100 Subject: [PATCH] [java-refactoring] isFirstUse: take PsiAssignmentExpression into account Fixes IDEA-361852 Java Inline Method refactor introduces intermediate variables GitOrigin-RevId: 680fbb62f3440b7ae29f4de1793260fe5be0ab36 --- .../intellij/refactoring/util/InlineUtil.java | 11 +++++++++-- .../inlineMethod/InlineDoubleCall.java | 17 +++++++++++++++++ .../inlineMethod/InlineDoubleCall.java.after | 11 +++++++++++ .../refactoring/inline/InlineMethodTest.java | 2 ++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl-refactorings/src/com/intellij/refactoring/util/InlineUtil.java index 2761da67d5c9..d83bd13f8fc3 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/util/InlineUtil.java @@ -553,8 +553,15 @@ public final class InlineUtil implements CommonJavaInlineUtil { call instanceof PsiNewExpression newExpression ? newExpression.getQualifier() : null; if (qualifier != null && !ExpressionUtils.isSafelyRecomputableExpression(qualifier)) return false; cur = call; - } - else if (parent instanceof PsiReferenceExpression ref) { + } else if (parent instanceof PsiAssignmentExpression assign && assign.getRExpression() == cur) { + PsiExpression lExpression = assign.getLExpression(); + if (lExpression instanceof PsiReferenceExpression lRef && + (lRef.getQualifierExpression() == null || lRef.getQualifierExpression() instanceof PsiQualifiedExpression)) { + cur = assign; + } else { + return false; + } + } else if (parent instanceof PsiReferenceExpression ref) { if (parent.getParent() instanceof PsiMethodCallExpression call) { cur = call; } else { diff --git a/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java b/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java new file mode 100644 index 000000000000..ca52e8c54b63 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java @@ -0,0 +1,17 @@ +import java.util.List; + +public class Foo { + + public Foo hi() { + System.out.println("hi"); + return this; + } + + public Foo hiTwice() { + return hi().hi(); + } + + public static void main(String[] args) { + new Foo().hi().hiTwice().hi(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java.after b/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java.after new file mode 100644 index 000000000000..0bc3a32e42e4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InlineDoubleCall.java.after @@ -0,0 +1,11 @@ +public class Foo { + + public Foo hi() { + System.out.println("hi"); + return this; + } + + public static void main(String[] args) { + new Foo().hi().hi().hi().hi(); + } +} \ 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 8a349078b876..4db0f3114811 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 @@ -580,6 +580,8 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testAndChainLambda() { doTest(); } public void testAndChainLambdaSingleLine() { doTest(); } + public void testInlineDoubleCall() { doTest(); } + public void testTernaryBranch() { doTest(); } public void testTernaryBranchCollapsible() { doTest(); }