diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 73c6da43e1b6..bb9a14607a17 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -327,10 +327,16 @@ public class InlineUtil { if (element instanceof PsiMethodReferenceExpression) return TailCallType.Return; PsiExpression methodCall = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); if (methodCall == null) return TailCallType.None; - PsiElement callParent = methodCall.getParent(); + PsiElement callParent = PsiUtil.skipParenthesizedExprUp(methodCall.getParent()); if (callParent instanceof PsiReturnStatement || callParent instanceof PsiLambdaExpression) { return TailCallType.Return; } + if (callParent instanceof PsiExpression && BoolUtils.isNegation((PsiExpression)callParent)) { + PsiElement negationParent = PsiUtil.skipParenthesizedExprUp(callParent.getParent()); + if (negationParent instanceof PsiReturnStatement || negationParent instanceof PsiLambdaExpression) { + return TailCallType.Invert; + } + } if (callParent instanceof PsiExpressionStatement) { PsiStatement curElement = (PsiStatement)callParent; while (true) { @@ -555,7 +561,17 @@ public class InlineUtil { Continue((methodCopy, callSite, returnType) -> { extractReturnValues(methodCopy, true); return null; - }), + }), + Invert((methodCopy, callSite, returnType) -> { + for (PsiReturnStatement statement : PsiUtil.findReturnStatements(methodCopy)) { + PsiExpression value = statement.getReturnValue(); + if (value != null) { + CommentTracker ct = new CommentTracker(); + ct.replaceAndRestoreComments(value, BoolUtils.getNegatedExpressionText(value, ct)); + } + } + return null; + }), Return((methodCopy, callSite, returnType) -> null); @Nullable diff --git a/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java new file mode 100644 index 000000000000..81ea0d0eec0c --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java @@ -0,0 +1,13 @@ + +class Test { + boolean check(String s) { + if (s == null) return false; + s = s.trim(); + if (s.isEmpty()) return false; + return s.length() % 2 == 0; + } + + boolean use(String s) { + return !check(s + s); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after new file mode 100644 index 000000000000..4e257dc35278 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InvertMethod.java.after @@ -0,0 +1,11 @@ + +class Test { + + boolean use(String s) { + String s1 = s + s; + if (s1 == null) return true; + 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/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java index 8eff88b103f4..cc94a8d40d15 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 @@ -514,6 +514,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testBooleanModelFinalCondition() { doTestAssertBadReturn(); } + + public void testInvertMethod() { + doTest(); + } @Override protected Sdk getProjectJDK() {