From fff2670c05e9ed252fa14a5ef6758bc95b47c7ea Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 23 Nov 2021 18:46:37 +0100 Subject: [PATCH] [java] inline: fix braces in switch branches (IDEA-282769) GitOrigin-RevId: 41257880f78e6cb7d301e75b8453baeb6780b57d --- .../inline/InlineMethodProcessor.java | 22 +++++++++++++++++-- .../inlineMethod/InSwitchExpression.java | 13 +++++++++++ .../InSwitchExpression.java.after | 10 +++++++++ .../inlineMethod/InSwitchExpressionYield.java | 13 +++++++++++ .../InSwitchExpressionYield.java.after | 10 +++++++++ .../refactoring/inline/InlineMethodTest.java | 2 ++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java.after create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.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 61d9c0382c69..c9a0eb83734b 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -1,4 +1,4 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.refactoring.inline; import com.intellij.codeInsight.ChangeContextUtil; @@ -49,6 +49,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.JavaPsiConstructorUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; +import com.siyeh.ig.psiutils.CodeBlockSurrounder; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.SideEffectChecker; import org.jetbrains.annotations.NonNls; @@ -978,6 +979,16 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { addedBracesVector.add(body); continue; } + else if (lambdaExpr instanceof PsiSwitchLabeledRuleStatement && parentStatement instanceof PsiExpressionStatement) { + CodeBlockSurrounder surrounder = CodeBlockSurrounder.forExpression(ref); + if (surrounder != null) { + CodeBlockSurrounder.SurroundResult surround = surrounder.surround(); + PsiExpression expression = surround.getExpression(); + addMarkedElements(refsVector, expression); + ContainerUtil.addIfNotNull(addedBracesVector, PsiTreeUtil.getParentOfType(surround.getAnchor(), PsiCodeBlock.class)); + continue; + } + } } else { final PsiField field = PsiTreeUtil.getParentOfType(ref, PsiField.class); @@ -1092,7 +1103,14 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { } } else if (codeBlockParent instanceof PsiBlockStatement) { - if (!(ifStatementWithAppendableElseBranch(statement) && + if (statement instanceof PsiYieldStatement) { + PsiExpression expression = ((PsiYieldStatement)statement).getExpression(); + if (expression != null) { + PsiExpressionStatement statementFromText = (PsiExpressionStatement)myFactory.createStatementFromText("a;", expression); + statementFromText.getExpression().replace(expression); + codeBlockParent.replace(statementFromText); + } + } else if (!(ifStatementWithAppendableElseBranch(statement) && codeBlockParent.getParent() instanceof PsiIfStatement && ((PsiIfStatement)codeBlockParent.getParent()).getElseBranch() != null)) { codeBlockParent.replace(statement); diff --git a/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java new file mode 100644 index 000000000000..04e321b1a045 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java @@ -0,0 +1,13 @@ +class X { + enum E {A} + + void print(E e) { + switch (e) { + case A -> printToInline(e); + } + } + + void printToInline(E e) { + System.out.println(e); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java.after b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java.after new file mode 100644 index 000000000000..2d7412bc595a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpression.java.after @@ -0,0 +1,10 @@ +class X { + enum E {A} + + void print(E e) { + switch (e) { + case A -> System.out.println(e); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java new file mode 100644 index 000000000000..aa0b33428619 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java @@ -0,0 +1,13 @@ +class X { + enum E {A} + + void print(E e) { + int p = switch (e) { + case A -> answer(); + } + } + + int answer() { + return 42; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java.after b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java.after new file mode 100644 index 000000000000..f2d8de35265d --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InSwitchExpressionYield.java.after @@ -0,0 +1,10 @@ +class X { + enum E {A} + + void print(E e) { + int p = switch (e) { + case A -> 42; + } + } + +} \ 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 e9562a80f572..832396736aea 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 @@ -551,6 +551,8 @@ public class InlineMethodTest extends LightRefactoringTestCase { } public void testAnonymousCall() { doTest(); } + public void testInSwitchExpression() { doTest(); } + public void testInSwitchExpressionYield() { doTest(); } @Override protected Sdk getProjectJDK() {