From ad8b1ea818a937f7ddd71f4d8b54e9826a0cab49 Mon Sep 17 00:00:00 2001 From: Greg Oledzki Date: Tue, 26 Aug 2025 09:55:33 +0200 Subject: [PATCH] Not unwrapping in case else if a simple if-return --- .../staticanalysis/UnwrapElseAfterReturn.java | 21 ++++++++++++++++++- .../UnwrapElseAfterReturnTest.java | 9 +++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturn.java b/src/main/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturn.java index 0cc19c9daa..aeb9eb2bf9 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturn.java +++ b/src/main/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturn.java @@ -60,8 +60,15 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { if (statement instanceof J.If) { J.If ifStatement = (J.If) statement; if (ifStatement.getElsePart() != null && endsWithReturnOrThrow(ifStatement.getThenPart())) { - J.If newIf = ifStatement.withElsePart(null); Statement elsePart = ifStatement.getElsePart().getBody(); + if (elsePart instanceof J.If) { + J.If elseIf = (J.If) elsePart; + if (isSimpleThenBlock(elseIf.getThenPart())) { + return statement; + } + } + + J.If newIf = ifStatement.withElsePart(null); if (elsePart instanceof J.Block) { J.Block elseBlock = (J.Block) elsePart; endWhitespace.set(elseBlock.getEnd()); @@ -90,6 +97,18 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { return maybeAutoFormat(b, alteredBlock, ctx); } + private boolean isSimpleThenBlock(Statement thenPart) { + if (thenPart instanceof J.Return) { + return true; + } + if (thenPart instanceof J.Block) { + J.Block block = (J.Block) thenPart; + return block.getStatements().size() == 1 && + block.getStatements().get(0) instanceof J.Return; + } + return false; + } + private boolean endsWithReturnOrThrow(Statement statement) { if (statement instanceof J.Return || statement instanceof J.Throw) { return true; diff --git a/src/test/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturnTest.java b/src/test/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturnTest.java index 012a8276ef..aedac0a262 100644 --- a/src/test/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturnTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/UnwrapElseAfterReturnTest.java @@ -357,11 +357,9 @@ class Test { int foo(String str) { if ("one".equals(str)) { return 1; - } - if ("two".equals(str)) { + } else if ("two".equals(str)) { return 2; - } - if ("three".equals(str)) { + } else if ("three".equals(str)) { return 3; } return Integer.MAX_VALUE; @@ -519,8 +517,7 @@ class Test { String process(int value) { if (value < 0) { throw new IllegalArgumentException("Negative value"); - } - if (value == 0) { + } else if (value == 0) { return "zero"; } return "positive";