From a8f1480bac3dc8c7786d78c48b58b5a6a1c22ee4 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 14 Feb 2024 23:57:12 +0100 Subject: [PATCH] [java] handle empty statements in "'if' statement with identical branches" quick fix (IDEA-233980) GitOrigin-RevId: 388e5c5195bda88b61526f0a393ed9d81ec18830 --- ...tementWithIdenticalBranchesInspection.java | 45 ++++++++++++++----- .../commonIfParts/afterEmptyStatements.java | 15 +++++++ .../commonIfParts/beforeEmptyStatements.java | 17 +++++++ 3 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/inspection/commonIfParts/afterEmptyStatements.java create mode 100644 java/java-tests/testData/inspection/commonIfParts/beforeEmptyStatements.java diff --git a/java/java-analysis-impl/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java b/java/java-analysis-impl/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java index 9577771a01dc..bad06af8cf8d 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java @@ -366,17 +366,38 @@ public final class IfStatementWithIdenticalBranchesInspection extends AbstractBa } PsiStatement[] thenStatements = ControlFlowUtils.unwrapBlock(ifStatement.getThenBranch()); PsiStatement[] elseStatements = ControlFlowUtils.unwrapBlock(ifStatement.getElseBranch()); - int thenLength = thenStatements.length; - int elseLength = elseStatements.length; - for (int i = 0; i < tailStatements.size(); i++) { - PsiStatement thenStatement = thenStatements[thenLength - 1 - i]; - // handling situation, when there is no braces around then branch - if (thenStatements.length == 1 && thenStatement.getParent() == ifStatement) { - thenStatement.replace(JavaPsiFacade.getElementFactory(thenStatement.getProject()).createCodeBlock()); - } else { - thenStatement.delete(); + for (int i = thenStatements.length - 1; i >= 0; i--) { + PsiStatement statement = thenStatements[i]; + if (!(statement instanceof PsiEmptyStatement)) break; + //emptyStatementCount++; + } + if (thenStatements.length == 1 && thenStatements[0].getParent() == ifStatement) { + thenStatements[0].replace(JavaPsiFacade.getElementFactory(ifStatement.getProject()).createCodeBlock()); + } + else { + deleteStatements(thenStatements, tailStatements.size(), ct, false); + } + deleteStatements(elseStatements, tailStatements.size(), ct, true); + } + } + + private static void deleteStatements(PsiStatement[] statements, int count, CommentTracker ct, boolean keepComments) { + for (int i = statements.length - 1; i >= 0; i--) { + PsiStatement statement = statements[i]; + if (statement instanceof PsiEmptyStatement) { + ct.delete(statement); + } + else if (count > 0) { + count--; + if (keepComments) { + ct.delete(statement); } - ct.delete(elseStatements[elseLength - 1 - i]); + else { + statement.delete(); + } + } + else { + break; } } } @@ -776,12 +797,12 @@ public final class IfStatementWithIdenticalBranchesInspection extends AbstractBa final Map mySubstitutionTable; private ThenElse(List headUnitsOfThen, - List tailUnitsOfThen, + List tailStatementsOfThen, boolean mayChangeSemantics, CommonPartType commonPartType, Map substitutionTable) { myHeadUnitsOfThen = headUnitsOfThen; - myTailStatementsOfThen = tailUnitsOfThen; + myTailStatementsOfThen = tailStatementsOfThen; myMayChangeSemantics = mayChangeSemantics; myCommonPartType = commonPartType; mySubstitutionTable = substitutionTable; diff --git a/java/java-tests/testData/inspection/commonIfParts/afterEmptyStatements.java b/java/java-tests/testData/inspection/commonIfParts/afterEmptyStatements.java new file mode 100644 index 000000000000..e34fc9b79d69 --- /dev/null +++ b/java/java-tests/testData/inspection/commonIfParts/afterEmptyStatements.java @@ -0,0 +1,15 @@ +// "Extract common part removing branch" "true" + +class EmptyStatements { + + private void refactor() { + if (new java.util.Random().nextBoolean()) { + foo(); + } + bar(); + } + + private void foo() {} + + private void bar() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/commonIfParts/beforeEmptyStatements.java b/java/java-tests/testData/inspection/commonIfParts/beforeEmptyStatements.java new file mode 100644 index 000000000000..b9c3145c3e2f --- /dev/null +++ b/java/java-tests/testData/inspection/commonIfParts/beforeEmptyStatements.java @@ -0,0 +1,17 @@ +// "Extract common part removing branch" "true" + +class EmptyStatements { + + private void refactor() { + if (new java.util.Random().nextBoolean()) { + foo(); + ;;bar();;;; + } else { + bar();; + } + } + + private void foo() {} + + private void bar() {} +} \ No newline at end of file