From f1473af5f4c543eb3db2b67e1fc5f164e028f497 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 22 Oct 2024 12:15:17 +0200 Subject: [PATCH] [java-refactoring] IDEA-361117 Inline method does not collapse lambda expression back after single-line method inlining GitOrigin-RevId: e54db7c5b175b264ac37c28a0cdab8ffd194c93f --- .../refactoring/inline/InlineMethodProcessor.java | 7 +++++++ .../refactoring/inlineMethod/InvertMethod.java.after | 2 +- .../refactoring/inlineMethod/LambdaIfAnd.java | 11 +++++++++++ .../refactoring/inlineMethod/LambdaIfAnd.java.after | 8 ++++++++ .../refactoring/inlineMethod/Substitution.java.after | 2 +- .../inlineMethod/UnusedParameter.java.after | 4 ++-- .../java/refactoring/inline/InlineMethodTest.java | 2 ++ 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 5fe1a72a1665..795d0eeb5285 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -748,6 +748,13 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { CommentTracker tracker = new CommentTracker(); PsiElement anchor = CommonJavaRefactoringUtil.getParentStatement(methodCall, true); assert anchor != null; + if (anchor instanceof PsiReturnStatement oldReturn && + PsiTreeUtil.skipWhitespacesAndCommentsBackward(anchor) instanceof PsiReturnStatement newReturn && + newReturn.getReturnValue() != null) { + // Remove new return instead of old return to preserve surrounder anchors + tracker.replace(Objects.requireNonNull(oldReturn.getReturnValue()), newReturn.getReturnValue()); + anchor = newReturn; + } if (firstAdded != null) { tracker.delete(anchor); tracker.insertCommentsBefore(firstAdded); diff --git a/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after index 4e257dc35278..f59e5c3b95f5 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after +++ b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after @@ -7,5 +7,5 @@ class Test { s1 = s1.trim(); if (s1.isEmpty()) return true; return s1.length() % 2 != 0; - } + } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java b/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java new file mode 100644 index 000000000000..7b52c6439d92 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java @@ -0,0 +1,11 @@ +import java.util.function.*; + +class InlineTest { + Predicate getPredicate(int value) { + return str -> str.length() > value && checkString(str); + } + + boolean checkString(String value) { + return value.startsWith("prefix") && value.endsWith("suffix"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java.after b/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java.after new file mode 100644 index 000000000000..2941a511212d --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/LambdaIfAnd.java.after @@ -0,0 +1,8 @@ +import java.util.function.*; + +class InlineTest { + Predicate getPredicate(int value) { + return str -> str.length() > value && str.startsWith("prefix") && str.endsWith("suffix"); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/Substitution.java.after b/java/java-tests/testData/refactoring/inlineMethod/Substitution.java.after index e33dbf9d0fe3..8f481894160f 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/Substitution.java.after +++ b/java/java-tests/testData/refactoring/inlineMethod/Substitution.java.after @@ -5,7 +5,7 @@ class Foo { final Computable elementComputable, Object processingContext) { return new WeighingComparable(elementComputable, new ProximityLocation(), new Weigher[0]); - } + } public static final Key WEIGHER_KEY = null; } diff --git a/java/java-tests/testData/refactoring/inlineMethod/UnusedParameter.java.after b/java/java-tests/testData/refactoring/inlineMethod/UnusedParameter.java.after index 8ff59781dd31..826e1f3425a9 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/UnusedParameter.java.after +++ b/java/java-tests/testData/refactoring/inlineMethod/UnusedParameter.java.after @@ -4,9 +4,9 @@ class Temp { } public Object foo(Set bar) { - if (bar.size() < 2) {// Inline this + if (bar.size() < 2) { bar.size(); // or online this - return null; + return null; // Inline this } return bar; 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 5de46a4a5214..03804dc38f7a 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 @@ -593,6 +593,8 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testRenameLocalClassDoubleConflict() { doTest(); } public void testBooleanResultInIfChain() { doTest(); } + + public void testLambdaIfAnd() { doTest(); } public void testInlineSingleImplementation() { TestDialogManager.setTestDialog(TestDialog.YES, getTestRootDisposable());