Skip to content

Commit ff0c329

Browse files
Fix ClassCastException in UseVarForGenericMethodInvocations (#1039)
Add instanceof check before casting to J.ParameterizedType in makeNestedGenericsExplicit(). The code assumed all NewClass clazz nodes are ParameterizedType, but they can also be J.Identifier (e.g., `new String(...)`) or J.FieldAccess (e.g., `new java.lang.String(...)`).
1 parent 41cc6b9 commit ff0c329

2 files changed

Lines changed: 65 additions & 1 deletion

File tree

src/main/java/org/openrewrite/java/migrate/lang/var/UseVarForGenericMethodInvocations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private J.MethodInvocation makeNestedGenericsExplicit(J.MethodInvocation mi, J.V
119119
if (arg instanceof J.NewClass) {
120120
J.NewClass newClass = (J.NewClass) arg;
121121
// Check if using diamond operator (rightTypeParams is empty)
122-
if (!hasTypeParams(newClass.getClazz())) {
122+
if (newClass.getClazz() instanceof J.ParameterizedType && !hasTypeParams(newClass.getClazz())) {
123123
// Copy type parameters from left side to right side
124124
J.ParameterizedType rightType = (J.ParameterizedType) newClass.getClazz();
125125
return newClass.withClazz(requireNonNull(rightType).withTypeParameters(leftTypeParams));

src/test/java/org/openrewrite/java/migrate/lang/var/UseVarForGenericMethodInvocationsTest.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,70 @@ interface Path<X> { }
331331
);
332332
}
333333

334+
@Test
335+
void nonParameterizedNewClassArgument() {
336+
//language=java
337+
rewriteRun(
338+
version(
339+
java(
340+
"""
341+
import java.util.Collections;
342+
import java.util.List;
343+
344+
class A {
345+
void m() {
346+
List<String> strs = Collections.singletonList(new String("test"));
347+
}
348+
}
349+
""",
350+
"""
351+
import java.util.Collections;
352+
import java.util.List;
353+
354+
class A {
355+
void m() {
356+
var strs = Collections.singletonList(new String("test"));
357+
}
358+
}
359+
"""
360+
),
361+
10
362+
)
363+
);
364+
}
365+
366+
@Test
367+
void fieldAccessNewClassArgument() {
368+
//language=java
369+
rewriteRun(
370+
version(
371+
java(
372+
"""
373+
import java.util.Collections;
374+
import java.util.List;
375+
376+
class A {
377+
void m() {
378+
List<java.lang.String> strs = Collections.singletonList(new java.lang.String("test"));
379+
}
380+
}
381+
""",
382+
"""
383+
import java.util.Collections;
384+
import java.util.List;
385+
386+
class A {
387+
void m() {
388+
var strs = Collections.singletonList(new java.lang.String("test"));
389+
}
390+
}
391+
"""
392+
),
393+
10
394+
)
395+
);
396+
}
397+
334398
@Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/868")
335399
@Test
336400
void genericsCollectorsRegression() {

0 commit comments

Comments
 (0)