From 28e0e142d64c71954a2ab93d826f2d28c03ceeb6 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 16 Nov 2017 18:33:50 +0100 Subject: [PATCH] inline: remove side effect free unused after inline return (IDEA-169056) --- .../refactoring/inline/InlineMethodProcessor.java | 6 ++++-- ...urnForTailTypeSimpleWhenNoSideEffectsPossible.java | 11 +++++++++++ ...TailTypeSimpleWhenNoSideEffectsPossible.java.after | 11 +++++++++++ .../java/refactoring/inline/InlineMethodTest.java | 4 ++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.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 5688484f9663..76febb3efe64 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -233,7 +233,8 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { final PsiReturnStatement[] returnStatements = PsiUtil.findReturnStatements(myMethod); for (PsiReturnStatement statement : returnStatements) { PsiExpression value = statement.getReturnValue(); - if (value != null && !(value instanceof PsiCallExpression)) { + if (value != null && !(value instanceof PsiCallExpression) && + RemoveUnusedVariableUtil.checkSideEffects(value, null, new ArrayList<>())) { for (UsageInfo info : usagesIn) { PsiReference reference = info.getReference(); if (reference != null) { @@ -894,7 +895,8 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { if (returnValue == null) continue; PsiStatement statement; if (tailCallType == InlineUtil.TailCallType.Simple) { - if (returnValue instanceof PsiExpression && returnStatement.getNextSibling() == myMethodCopy.getBody().getLastBodyElement()) { + if (returnStatement.getNextSibling() == myMethodCopy.getBody().getLastBodyElement() && + RemoveUnusedVariableUtil.checkSideEffects(returnValue, null, new ArrayList<>())) { PsiExpressionStatement exprStatement = (PsiExpressionStatement) myFactory.createStatementFromText("a;", null); exprStatement.getExpression().replace(returnValue); returnStatement.getParent().addBefore(exprStatement, returnStatement); diff --git a/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java b/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java new file mode 100644 index 000000000000..db97a2d7be56 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java @@ -0,0 +1,11 @@ + +class InlineMethod { + void test() { + other(); + } + + InlineMethod other() { + System.out.println(""); + return this; + } +} diff --git a/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java.after b/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java.after new file mode 100644 index 000000000000..bbe09d353084 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/RemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible.java.after @@ -0,0 +1,11 @@ + +class InlineMethod { + void test() { + System.out.println(""); + } + + InlineMethod other() { + System.out.println(""); + return this; + } +} 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 6ab05b21d321..12dceebdeb18 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 @@ -359,6 +359,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTestInlineThisOnly(); } + public void testRemoveReturnForTailTypeSimpleWhenNoSideEffectsPossible() { + doTestInlineThisOnly(); + } + public void testDeleteOverrideAnnotations() { doTest(); }