Skip to content

Commit ac1e235

Browse files
authored
Improved the support of types in IfElseIfConstructToSwitch (#774)
1 parent 60f957e commit ac1e235

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

src/main/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitch.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ private boolean validatePotentialCandidate() {
157157
if (patternMatchers.keySet().stream().anyMatch(instanceOf -> instanceOf.getPattern() == null)) {
158158
return false;
159159
}
160+
// Do no harm -> If we do not know how to replace(yet), do not replace
161+
if (patternMatchers.keySet().stream().anyMatch(instanceOf -> {
162+
J clazz = instanceOf.getClazz();
163+
return !(clazz instanceof J.Identifier || clazz instanceof J.FieldAccess || clazz instanceof J.ArrayType || clazz instanceof J.ParameterizedType);
164+
})) {
165+
return false;
166+
}
160167
boolean nullCaseInSwitch = nullCheckedParameter != null && SemanticallyEqual.areEqual(nullCheckedParameter, switchOn.get());
161168
boolean hasLastElseBlock = else_ != null;
162169

@@ -223,10 +230,9 @@ private Optional<Expression> switchOn() {
223230
private String getClassName(J.InstanceOf statement) {
224231
if (statement.getClazz() instanceof J.Identifier) {
225232
return ((J.Identifier) statement.getClazz()).getSimpleName();
226-
} else if (statement.getClazz() instanceof J.FieldAccess) {
227-
return ((J.FieldAccess) statement.getClazz()).toString();
228233
}
229-
throw new IllegalStateException("Found unsupported statement where clazz is " + statement.getClazz());
234+
235+
return statement.getClazz().toString();
230236
}
231237

232238
private String getPattern(J.InstanceOf statement) {

src/test/java/org/openrewrite/java/migrate/lang/IfElseIfConstructToSwitchTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,58 @@ private static class Tester {
242242
);
243243
}
244244

245+
@Test
246+
void worksWithGenericsAndArrays() {
247+
rewriteRun(
248+
//language=java
249+
java(
250+
"""
251+
public class AnotherClass {
252+
public static class SubClass<T> {}
253+
}
254+
"""
255+
),
256+
//language=java
257+
java(
258+
"""
259+
class Test {
260+
static String formatter(Object obj) {
261+
String formatted = "initialValue";
262+
if (obj == null) {
263+
formatted = "null";
264+
} else if (obj instanceof String str)
265+
formatted = String.format("string %s", str);
266+
else if (obj instanceof String[] strings) {
267+
formatted = String.format("strings %s", (Object) strings);
268+
} else if (obj instanceof Class<?> clazz) {
269+
formatted = String.format("class %s", clazz.getSimpleName());
270+
} else if (obj instanceof AnotherClass.SubClass<?> subClazz) {
271+
formatted = String.format("sub-class %s", subClazz);
272+
}
273+
return formatted;
274+
}
275+
}
276+
""",
277+
"""
278+
class Test {
279+
static String formatter(Object obj) {
280+
String formatted = "initialValue";
281+
switch (obj) {
282+
case null -> formatted = "null";
283+
case String str -> formatted = String.format("string %s", str);
284+
case String[] strings -> formatted = String.format("strings %s", (Object) strings);
285+
case Class<?> clazz -> formatted = String.format("class %s", clazz.getSimpleName());
286+
case AnotherClass.SubClass<?> subClazz -> formatted = String.format("sub-class %s", subClazz);
287+
default -> {}
288+
}
289+
return formatted;
290+
}
291+
}
292+
"""
293+
)
294+
);
295+
}
296+
245297
@Test
246298
void defaultSwitchBlockFinalElseStatement() {
247299
rewriteRun(

0 commit comments

Comments
 (0)