From de923b346cfbc069e9db8565c93af270ecd09a70 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 6 Nov 2017 18:17:05 +0100 Subject: [PATCH] inline: expand expression lambda to code block for return-inline (IDEA-180888) --- .../intellij/refactoring/util/InlineUtil.java | 9 ++++--- .../ExprLambdaExpandToCodeBlock.java | 16 +++++++++++++ .../ExprLambdaExpandToCodeBlock.java.after | 24 +++++++++++++++++++ .../refactoring/inline/InlineMethodTest.java | 4 ++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java.after 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 1385ef1ffca4..b1f1662155b0 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -314,9 +314,12 @@ public class InlineUtil { if (element instanceof PsiMethodReferenceExpression) return TailCallType.None; PsiExpression methodCall = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); if (methodCall == null) return TailCallType.None; - if (methodCall.getParent() instanceof PsiReturnStatement) return TailCallType.Return; - if (methodCall.getParent() instanceof PsiExpressionStatement) { - PsiStatement callStatement = (PsiStatement) methodCall.getParent(); + PsiElement callParent = methodCall.getParent(); + if (callParent instanceof PsiReturnStatement || callParent instanceof PsiLambdaExpression) { + return TailCallType.Return; + } + if (callParent instanceof PsiExpressionStatement) { + PsiStatement callStatement = (PsiStatement)callParent; PsiMethod callerMethod = PsiTreeUtil.getParentOfType(callStatement, PsiMethod.class); if (callerMethod != null) { final PsiStatement[] psiStatements = callerMethod.getBody().getStatements(); diff --git a/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java b/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java new file mode 100644 index 000000000000..68aaf11aac6b --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java @@ -0,0 +1,16 @@ + +import java.util.Comparator; + +class InlineLambda { + private static int compare(Integer i, Integer j) { + if (i > j) { + return 1; + } + if (j > i) { + return -1; + } + return 0; + } + + private static Comparator COMP = (o1, o2) -> compare(o1, o2); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java.after b/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java.after new file mode 100644 index 000000000000..cddda74f2936 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ExprLambdaExpandToCodeBlock.java.after @@ -0,0 +1,24 @@ + +import java.util.Comparator; + +class InlineLambda { + private static int compare(Integer i, Integer j) { + if (i > j) { + return 1; + } + if (j > i) { + return -1; + } + return 0; + } + + private static Comparator COMP = (o1, o2) -> { + if (o1 > o2) { + return 1; + } + if (o2 > o1) { + return -1; + } + return 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 5bf5dfcf1ed9..88930a85f50a 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 @@ -339,6 +339,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTestConflict("Constructor SomeClass.SomeClass() that is used in inlined method is not accessible from call site(s) in method InlineWithPrivateConstructorAccessMain.main(String...)"); } + public void testExprLambdaExpandToCodeBlock() { + doTestInlineThisOnly(); + } + public void testSuperCallWhenUnqualifiedInline() { doTestInlineThisOnly(); }