From e30711cb8737f4d57c56641316a6e470a816f517 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 20 Mar 2017 14:22:36 +0100 Subject: [PATCH] inline constructor: allow inlining constructors with multiple statements in chained constructor calls (IDEA-168258) --- .../refactoring/inline/InlineMethodProcessor.java | 6 +++--- .../ChainedConstructorWithMultipleStatements.java | 11 +++++++++++ ...ainedConstructorWithMultipleStatements.java.after | 12 ++++++++++++ .../refactoring/inline/InlineMethodTest.java | 4 ++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.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 c3417897e5fa..3306de196f64 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -1540,12 +1540,12 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { public static String checkCalledInSuperOrThisExpr(PsiCodeBlock methodBody, final PsiElement element) { if (methodBody.getStatements().length > 1) { - PsiExpression expr = PsiTreeUtil.getParentOfType(element, PsiExpression.class); + PsiMethodCallExpression expr = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class, true, PsiStatement.class); while (expr != null) { - if (RefactoringChangeUtil.isSuperOrThisMethodCall(expr)) { + if (RefactoringChangeUtil.isSuperOrThisMethodCall(expr) && expr.getMethodExpression() != element) { return "Inline cannot be applied to multiline method in constructor call"; } - expr = PsiTreeUtil.getParentOfType(expr, PsiExpression.class, true); + expr = PsiTreeUtil.getParentOfType(expr, PsiMethodCallExpression.class, true, PsiStatement.class); } } return null; diff --git a/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java b/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java new file mode 100644 index 000000000000..0b4e80bdf28a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java @@ -0,0 +1,11 @@ +class A { + + public A(int i) { + System.out.println(i); + System.out.println(i); + } + + public A() { + this(0); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java.after b/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java.after new file mode 100644 index 000000000000..af7b69e43b6d --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/ChainedConstructorWithMultipleStatements.java.after @@ -0,0 +1,12 @@ +class A { + + public A(int i) { + System.out.println(i); + System.out.println(i); + } + + public A() { + System.out.println(0); + System.out.println(0); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java index 488995d7b5fb..e36383af4a1d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -361,6 +361,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTest(); } + public void testChainedConstructorWithMultipleStatements() throws Exception { + doTestInlineThisOnly(); + } + @Override protected Sdk getProjectJDK() { return getTestName(false).contains("Src") ? IdeaTestUtil.getMockJdk17() : super.getProjectJDK();