Skip to content

Commit

Permalink
Issue-566: Fix double brace init for non-string types (#588)
Browse files Browse the repository at this point in the history
  • Loading branch information
BramliAK authored Oct 23, 2024
1 parent 3e98d85 commit 7d7c0e4
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 30 deletions.
61 changes: 31 additions & 30 deletions src/main/java/org/openrewrite/java/migrate/util/UseMapOf.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,40 +48,41 @@ public String getDescription() {

@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return Preconditions.check(Preconditions.and(new UsesJavaVersion<>(10), new UsesMethod<>(NEW_HASH_MAP)), new JavaVisitor<ExecutionContext>() {
@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<Expression> 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<ExecutionContext> {
@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<Expression> 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;
}
}
}
36 changes: 36 additions & 0 deletions src/test/java/org/openrewrite/java/migrate/util/UseMapOfTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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");
}
}
"""
)
);
}
}

0 comments on commit 7d7c0e4

Please sign in to comment.