Skip to content

Commit d5db0d7

Browse files
authored
Preserve explicit type arguments in MigrateCollections* recipes (#1099)
Without this, `Collections.<K, V>emptyMap()` was rewritten to `Map.of()`, losing the type witness needed in contexts like ternaries where the compiler cannot otherwise infer the type parameters.
1 parent 8ba21db commit d5db0d7

4 files changed

Lines changed: 35 additions & 3 deletions

File tree

src/main/java/org/openrewrite/java/migrate/util/MigrateCollectionsEmptyList.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
5353
if (EMPTY_LIST.matches(m)) {
5454
maybeRemoveImport("java.util.Collections");
5555
maybeAddImport("java.util.List");
56-
return JavaTemplate.builder("List.of()")
56+
J.MethodInvocation result = JavaTemplate.builder("List.of()")
5757
.imports("java.util.List")
5858
.build()
5959
.apply(updateCursor(m), m.getCoordinates().replace());
60+
return result.withTypeParameters(m.getPadding().getTypeParameters());
6061
}
6162

6263
return m;

src/main/java/org/openrewrite/java/migrate/util/MigrateCollectionsEmptyMap.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
5353
if (EMPTY_MAP.matches(m)) {
5454
maybeRemoveImport("java.util.Collections");
5555
maybeAddImport("java.util.Map");
56-
return JavaTemplate.builder("Map.of()")
56+
J.MethodInvocation result = JavaTemplate.builder("Map.of()")
5757
.imports("java.util.Map")
5858
.build()
5959
.apply(updateCursor(m), m.getCoordinates().replace());
60+
return result.withTypeParameters(m.getPadding().getTypeParameters());
6061
}
6162

6263
return m;

src/main/java/org/openrewrite/java/migrate/util/MigrateCollectionsEmptySet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
5353
if (EMPTY_SET.matches(m)) {
5454
maybeRemoveImport("java.util.Collections");
5555
maybeAddImport("java.util.Set");
56-
return JavaTemplate.builder("Set.of()")
56+
J.MethodInvocation result = JavaTemplate.builder("Set.of()")
5757
.imports("java.util.Set")
5858
.build()
5959
.apply(updateCursor(m), m.getCoordinates().replace());
60+
return result.withTypeParameters(m.getPadding().getTypeParameters());
6061
}
6162

6263
return m;

src/test/java/org/openrewrite/java/migrate/util/MigrateCollectionsEmptyMapTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,35 @@ void call() {
111111
);
112112
}
113113

114+
@Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/1097")
115+
@Test
116+
void preserveExplicitTypeArgumentsInTernary() {
117+
rewriteRun(
118+
//language=java
119+
java(
120+
"""
121+
import java.util.Collections;
122+
import java.util.Map;
123+
124+
class Main<K, V> {
125+
Map<K, V> get(final Map<K, V> input) {
126+
return input == null ? Collections.<K, V>emptyMap() : input;
127+
}
128+
}
129+
""",
130+
"""
131+
import java.util.Map;
132+
133+
class Main<K, V> {
134+
Map<K, V> get(final Map<K, V> input) {
135+
return input == null ? Map.<K, V>of() : input;
136+
}
137+
}
138+
"""
139+
)
140+
);
141+
}
142+
114143
@Test
115144
void emptyMapInSwitchExpression() {
116145
rewriteRun(

0 commit comments

Comments
 (0)