From 7d7c0e456e19ad4e1b991a654b731f554b8eb59f Mon Sep 17 00:00:00 2001 From: BramliAK <39566577+BramliAK@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:42:43 +0200 Subject: [PATCH] Issue-566: Fix double brace init for non-string types (#588) --- .../java/migrate/util/UseMapOf.java | 61 ++++++++++--------- .../java/migrate/util/UseMapOfTest.java | 36 +++++++++++ 2 files changed, 67 insertions(+), 30 deletions(-) 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 f0aed06042..43fe6d2080 100644 --- a/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java +++ b/src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java @@ -48,40 +48,41 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(Preconditions.and(new UsesJavaVersion<>(10), new UsesMethod<>(NEW_HASH_MAP)), new JavaVisitor() { - @Override - public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { - J.NewClass n = (J.NewClass) super.visitNewClass(newClass, ctx); - J.Block body = n.getBody(); - if (NEW_HASH_MAP.matches(n) && body != null) { - if (body.getStatements().size() == 1) { - Statement statement = body.getStatements().get(0); - if (statement instanceof J.Block) { - List args = new ArrayList<>(); - StringJoiner mapOf = new StringJoiner(", ", "Map.of(", ")"); - for (Statement stat : ((J.Block) statement).getStatements()) { - if (stat instanceof J.MethodInvocation && MAP_PUT.matches((Expression) stat)) { - J.MethodInvocation put = (J.MethodInvocation) stat; - args.addAll(put.getArguments()); - mapOf.add("#{}"); - mapOf.add("#{}"); - } else { - return n; - } - } + return Preconditions.check(Preconditions.and(new UsesJavaVersion<>(10), + new UsesMethod<>(NEW_HASH_MAP)), new UseMapOfVisitor()); + } - maybeRemoveImport("java.util.HashMap"); - maybeAddImport("java.util.Map"); - return JavaTemplate.builder(mapOf.toString()) - .contextSensitive() - .imports("java.util.Map") - .build() - .apply(updateCursor(n), n.getCoordinates().replace(), args.toArray()); + private static class UseMapOfVisitor extends JavaVisitor { + @Override + public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { + J.NewClass n = (J.NewClass) super.visitNewClass(newClass, ctx); + J.Block body = n.getBody(); + if (NEW_HASH_MAP.matches(n) && body != null && body.getStatements().size() == 1) { + Statement statement = body.getStatements().get(0); + if (statement instanceof J.Block) { + List args = new ArrayList<>(); + StringJoiner mapOf = new StringJoiner(", ", "Map.of(", ")"); + for (Statement stat : ((J.Block) statement).getStatements()) { + if (!(stat instanceof J.MethodInvocation) || !MAP_PUT.matches((Expression) stat)) { + return n; } + J.MethodInvocation put = (J.MethodInvocation) stat; + args.addAll(put.getArguments()); + mapOf.add("#{any()}"); + mapOf.add("#{any()}"); } + + maybeRemoveImport("java.util.HashMap"); + maybeAddImport("java.util.Map"); + return JavaTemplate.builder(mapOf.toString()) + .contextSensitive() + .imports("java.util.Map") + .build() + .apply(updateCursor(n), n.getCoordinates().replace(), args.toArray()); } - return n; } - }); + + return n; + } } } 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 9213828023..f31329b7b0 100644 --- a/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java +++ b/src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java @@ -17,6 +17,7 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.Issue; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -58,4 +59,39 @@ class Test { ) ); } + + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/566") + @Test + void changeDoubleBraceInitForNonStringTypes() { + //language=java + rewriteRun( + java( + """ + import java.util.HashMap; + import java.util.Map; + + class Test { + private static final String BLAH ="ss"; + + void foo() { + new HashMap<>() {{ + put(BLAH, "foo"); + }}; + } + } + """, + """ + import java.util.Map; + + class Test { + private static final String BLAH ="ss"; + + void foo() { + Map.of(BLAH, "foo"); + } + } + """ + ) + ); + } }