From 50ff44aebd9917603f37698055eaaa49b42ee8a2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 16 Jul 2019 17:10:52 +0700 Subject: [PATCH] IDEA-218391 Transform to single return: remove excessive braces in if-else chains. GitOrigin-RevId: b13d36218843ae5ff7fbfbcadc898113ad4c9bc1 --- .../ReturnReplacementContext.java | 37 ++++++++++++++----- .../afterBooleanNestedIf.java | 10 ++--- .../convertToSingleReturn/afterIntIfs.java | 8 ++-- .../afterSynchronized.java | 8 ++-- .../afterSynchronized2.java | 6 +-- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/singlereturn/ReturnReplacementContext.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/singlereturn/ReturnReplacementContext.java index e3d4669c0f27..13090024acd3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/singlereturn/ReturnReplacementContext.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/singlereturn/ReturnReplacementContext.java @@ -289,34 +289,53 @@ class ReturnReplacementContext { } PsiCodeBlock block = tryCast(myReturnStatement.getParent(), PsiCodeBlock.class); new CommentTracker().deleteAndRestoreComments(myReturnStatement); - cleanUpEmptyBlocks(block); + PsiElement place = cleanUpEmptyBlocks(block); + stripUnnecessaryBlocks(place); } - private static void cleanUpEmptyBlocks(PsiCodeBlock block) { - if (block == null || !block.isEmpty()) return; + private void stripUnnecessaryBlocks(PsiElement place) { + while (place != null && place != myBlock) { + if (place instanceof PsiBlockStatement) { + PsiIfStatement parentIf = tryCast(place.getParent(), PsiIfStatement.class); + if (parentIf != null && parentIf.getElseBranch() == place) { + PsiIfStatement childIf = tryCast(ControlFlowUtils.stripBraces((PsiStatement)place), PsiIfStatement.class); + if (childIf != null) { + place = place.replace(childIf); + } + } + } + place = place.getParent(); + } + } + + private static PsiElement cleanUpEmptyBlocks(PsiCodeBlock block) { + if (block == null || !block.isEmpty()) return block; PsiBlockStatement blockStatement = tryCast(block.getParent(), PsiBlockStatement.class); - if (blockStatement == null) return; + if (blockStatement == null) return block; PsiIfStatement parent = tryCast(blockStatement.getParent(), PsiIfStatement.class); - if (parent == null) return; + if (parent == null) return block; PsiExpression condition = parent.getCondition(); - if (condition == null) return; + if (condition == null) return block; if (blockStatement == parent.getElseBranch()) { new CommentTracker().deleteAndRestoreComments(blockStatement); + return parent; } - else if (blockStatement == parent.getThenBranch()) { + if (blockStatement == parent.getThenBranch()) { if (parent.getElseBranch() != null) { new CommentTracker().replaceAndRestoreComments(blockStatement, parent.getElseBranch()); parent.getElseBranch().delete(); CommentTracker ct = new CommentTracker(); String negatedCondition = BoolUtils.getNegatedExpressionText(condition, ct); ct.replaceAndRestoreComments(condition, negatedCondition); + return parent; } - else if (!SideEffectChecker.mayHaveSideEffects(condition)) { + if (!SideEffectChecker.mayHaveSideEffects(condition)) { PsiCodeBlock parentBlock = tryCast(parent.getParent(), PsiCodeBlock.class); new CommentTracker().deleteAndRestoreComments(parent); - cleanUpEmptyBlocks(parentBlock); + return cleanUpEmptyBlocks(parentBlock); } } + return block; } static void replaceSingleReturn(@NotNull Project project, diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterBooleanNestedIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterBooleanNestedIf.java index 03409e0cf2df..154c93fe8b32 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterBooleanNestedIf.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterBooleanNestedIf.java @@ -12,12 +12,10 @@ class Test { s = arr[1]; if (s == null) { result = false; - } else { - if (arr.length > 3) { - s = arr[2]; - if (s != null && s.isEmpty()) { - result = false; - } + } else if (arr.length > 3) { + s = arr[2]; + if (s != null && s.isEmpty()) { + result = false; } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterIntIfs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterIntIfs.java index 5b154366c86b..8488ccdb26a1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterIntIfs.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterIntIfs.java @@ -8,12 +8,10 @@ class Test { } else { result = 4; } + } else if (s.isEmpty()) { + result = 3; } else { - if (s.isEmpty()) { - result = 3; - } else { - System.out.println(s); - } + System.out.println(s); } return result; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized.java index 663f0f98f668..32e88d1c0072 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized.java @@ -5,12 +5,10 @@ class Test { synchronized (this) { if (x == 0) { result = "foo"; + } else if (x == 1) { + result = "bar"; } else { - if (x == 1) { - result = "bar"; - } else { - result = "baz"; - } + result = "baz"; } } return result; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized2.java index 0538a2303120..5572d010f16c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertToSingleReturn/afterSynchronized2.java @@ -5,10 +5,8 @@ class Test { synchronized (this) { if (x == 0) { result = "foo"; - } else { - if (x == 1) { - result = "bar"; - } + } else if (x == 1) { + result = "bar"; } } if (result == null) {