From e63972b90a78c3a752c053745eb8cc3ab0feb7b4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 18 Mar 2026 12:03:14 +0100 Subject: [PATCH 1/2] Fix IfElseIfConstructToSwitch null safety regression (issue #1013) When converting instanceof chains to switch without an explicit null check, emit `case null, default` instead of just `default` to preserve instanceof's null-safe behavior. Previously, the recipe would generate code that throws NPE when the switched variable is null, unlike the original if-else chain. --- .../java/migrate/lang/IfElseIfConstructToSwitch.java | 2 +- .../java/migrate/lang/IfElseIfConstructToSwitchTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitch.java b/src/main/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitch.java index c1efc233ff..b9e81db9ca 100644 --- a/src/main/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitch.java +++ b/src/main/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitch.java @@ -212,7 +212,7 @@ public J.Return visitReturn(J.Return return_, AtomicBoolean atomicBoolean) { arguments[i++] = getPattern(instanceOf); arguments[i++] = getStatement(entry.getValue()); } - switchBody.append("default -> #{any()};\n"); + switchBody.append(nullCheckedParameter != null ? "default" : "case null, default").append(" -> #{any()};\n"); if (else_ != null) { arguments[i] = getStatement(else_); } else { diff --git a/src/test/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitchTest.java b/src/test/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitchTest.java index e495e41d96..4b817369e1 100644 --- a/src/test/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitchTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitchTest.java @@ -128,7 +128,7 @@ static String formatter(Object obj) { String str = "String"; formatted = String.format("%s %s", str, s); } - default -> formatted = "unknown"; + case null, default -> formatted = "unknown"; } return formatted; } @@ -331,7 +331,7 @@ static String formatter(Object obj) { String str = "String"; formatted = String.format("%s %s", str, s); } - default -> formatted = "unknown"; + case null, default -> formatted = "unknown"; } return formatted; } @@ -436,7 +436,7 @@ static String describe(Object obj) { case Dog d -> result = "dog"; case Cat c -> result = "cat"; case Bird b -> result = "bird"; - default -> result = "unknown"; + case null, default -> result = "unknown"; } return result; } From 1127076e759ab84863c2e254e8479959008365d2 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 18 Mar 2026 12:15:36 +0100 Subject: [PATCH 2/2] Fix UpgradeToJava21Test expectation for case null, default --- .../java/org/openrewrite/java/migrate/UpgradeToJava21Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/openrewrite/java/migrate/UpgradeToJava21Test.java b/src/test/java/org/openrewrite/java/migrate/UpgradeToJava21Test.java index 35074ab352..4470a0e4d1 100644 --- a/src/test/java/org/openrewrite/java/migrate/UpgradeToJava21Test.java +++ b/src/test/java/org/openrewrite/java/migrate/UpgradeToJava21Test.java @@ -61,7 +61,7 @@ private static double convertToDouble(Object value) { case String string -> Double.parseDouble(string); case Integer integer -> integer.doubleValue(); case Long long1 -> long1.doubleValue(); - default -> (double) value; + case null, default -> (double) value; }; } }