From 802472a1469bd2e2b83944673d5e36351ec0d56a Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 11 May 2026 07:40:08 -0400 Subject: [PATCH] Skip `UseMapOf` when `put()` argument is a null literal `Map.of(..)` throws `NullPointerException` on null keys or values, so converting a `HashMap` containing null arguments is not behavior-preserving. Fixes #1092 --- .../java/migrate/util/UseMapOf.java | 5 +++ .../java/migrate/util/UseMapOfTest.java | 42 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java b/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java index 92e01a35f8..5c61a4fc80 100644 --- a/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java +++ b/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java @@ -68,6 +68,11 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { return n; } J.MethodInvocation put = (J.MethodInvocation) stat; + for (Expression arg : put.getArguments()) { + if (J.Literal.isLiteralValue(arg, null)) { + return n; + } + } args.addAll(put.getArguments()); if (useEntries) { template.add("Map.entry(#{any()}, #{any()})"); diff --git a/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java b/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java index dc3e1a06ec..e406c324a1 100644 --- a/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java +++ b/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java @@ -163,6 +163,48 @@ Map values() { ); } + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/1092") + @Test + void doNotChangeWhenNullValue() { + //language=java + rewriteRun( + java( + """ + import java.util.HashMap; + import java.util.Map; + + class Test { + Map m = new HashMap<>() {{ + put("key", "value"); + put("nullable", null); + }}; + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/1092") + @Test + void doNotChangeWhenNullKey() { + //language=java + rewriteRun( + java( + """ + import java.util.HashMap; + import java.util.Map; + + class Test { + Map m = new HashMap<>() {{ + put(null, "value"); + put("key", "other"); + }}; + } + """ + ) + ); + } + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/566") @Test void changeDoubleBraceInitForNonStringTypes() {