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 d469f36014..b116e4188c 100644 --- a/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java +++ b/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java @@ -302,6 +302,12 @@ private String matchingTargetName(J.VariableDeclarations decl) { if (!NEW_HASH_MAP.matches(nc)) { return null; } + // Skip `HashMap` subclasses like `LinkedHashMap`/`TreeMap`: `Map.of(..)` makes no + // iteration-order guarantee, so absorbing their `put(..)` chain would silently drop + // the ordering contract the original code relied on (issue #1163, matching #1113). + if (!TypeUtils.isOfClassType(nc.getClazz() != null ? nc.getClazz().getType() : null, "java.util.HashMap")) { + return null; + } if (nc.getBody() != null) { return null; } 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 d07ba37072..46e53aa370 100644 --- a/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java +++ b/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java @@ -290,6 +290,30 @@ class Test { ); } + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/1163") + @Test + void doNotChangeLinkedHashMapBuiltWithPutStatements() { + //language=java + rewriteRun( + java( + """ + import java.util.LinkedHashMap; + import java.util.Map; + + class Test { + static Map ordered() { + Map m = new LinkedHashMap<>(); + m.put("a", "1"); + m.put("b", "2"); + m.put("c", "3"); + return m; + } + } + """ + ) + ); + } + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/566") @Test void changeDoubleBraceInitForNonStringTypes() {