Skip to content

Commit 5027edb

Browse files
Merge pull request #204 from openrewrite/minimum-switch-enums
Manually create LST for enums in `MinimumSwitchCases`
2 parents 0fd7159 + 108c66d commit 5027edb

3 files changed

Lines changed: 95 additions & 30 deletions

File tree

src/main/java/org/openrewrite/staticanalysis/JavaElementFactory.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@
2727

2828
final class JavaElementFactory {
2929

30+
static J.Binary newLogicalExpression(J.Binary.Type operator, Expression left, Expression right) {
31+
return new J.Binary(
32+
randomId(),
33+
Space.EMPTY,
34+
Markers.EMPTY,
35+
left,
36+
new JLeftPadded<>(Space.SINGLE_SPACE, operator, Markers.EMPTY),
37+
right,
38+
JavaType.Primitive.Boolean
39+
);
40+
}
41+
3042
static J.MemberReference newStaticMethodReference(JavaType.Method method, boolean qualified, @Nullable JavaType type) {
3143
JavaType.FullyQualified declaringType = method.getDeclaringType();
3244
Expression containing = className(declaringType, qualified);

src/main/java/org/openrewrite/staticanalysis/MinimumSwitchCases.java

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
import lombok.AllArgsConstructor;
1919
import lombok.Value;
2020
import lombok.With;
21+
import org.jetbrains.annotations.NotNull;
2122
import org.openrewrite.ExecutionContext;
2223
import org.openrewrite.Recipe;
23-
import org.openrewrite.Tree;
2424
import org.openrewrite.TreeVisitor;
2525
import org.openrewrite.internal.ListUtils;
2626
import org.openrewrite.internal.RecipeRunException;
@@ -29,6 +29,7 @@
2929
import org.openrewrite.java.ShortenFullyQualifiedTypeReferences;
3030
import org.openrewrite.java.tree.*;
3131
import org.openrewrite.marker.Marker;
32+
import org.openrewrite.marker.Markers;
3233

3334
import java.time.Duration;
3435
import java.util.ArrayList;
@@ -39,6 +40,7 @@
3940
import static java.util.Collections.singleton;
4041
import static java.util.Collections.singletonList;
4142
import static java.util.Objects.requireNonNull;
43+
import static org.openrewrite.Tree.randomId;
4244

4345
public class MinimumSwitchCases extends Recipe {
4446
@Override
@@ -73,12 +75,7 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
7375
final JavaTemplate ifElseIfString = JavaTemplate.builder("" +
7476
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
7577
"} else if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
76-
"}").contextSensitive().build();
77-
78-
final JavaTemplate ifElseIfEnum = JavaTemplate.builder("" +
79-
"if(#{any()} == #{}) {\n" +
80-
"} else if(#{any()} == #{}) {\n" +
81-
"}").contextSensitive().build();
78+
"}").build();
8279

8380
final JavaTemplate ifElsePrimitive = JavaTemplate.builder("" +
8481
"if(#{any()} == #{any()}) {\n" +
@@ -88,24 +85,15 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
8885
final JavaTemplate ifElseString = JavaTemplate.builder("" +
8986
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
9087
"} else {\n" +
91-
"}").contextSensitive().build();
92-
93-
final JavaTemplate ifElseEnum = JavaTemplate.builder("" +
94-
"if(#{any()} == #{}) {\n" +
95-
"} else {\n" +
96-
"}").contextSensitive().build();
88+
"}").build();
9789

9890
final JavaTemplate ifPrimitive = JavaTemplate.builder("" +
9991
"if(#{any()} == #{any()}) {\n" +
10092
"}").contextSensitive().build();
10193

10294
final JavaTemplate ifString = JavaTemplate.builder("" +
10395
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
104-
"}").contextSensitive().build();
105-
106-
final JavaTemplate ifEnum = JavaTemplate.builder("" +
107-
"if(#{any()} == #{}) {\n" +
108-
"}").contextSensitive().build();
96+
"}").build();
10997

11098
@Override
11199
public J visitBlock(J.Block block, ExecutionContext executionContext) {
@@ -174,18 +162,26 @@ public J visitSwitch(J.Switch switch_, ExecutionContext ctx) {
174162
generatedIf = ifElseIfString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree, cases[1].getPattern(), tree);
175163
}
176164
} else if (switchesOnEnum(switch_)) {
177-
if (cases[1] == null) {
178-
if (isDefault(cases[0])) {
179-
return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly()));
180-
} else {
181-
generatedIf = ifEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern()));
165+
if (cases[1] == null && isDefault(cases[0])) {
166+
return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly()));
167+
}
168+
169+
generatedIf = createIfForEnum(tree, cases[0].getPattern());
170+
if (cases[1] != null) {
171+
Statement elseBody = J.Block.createEmptyBlock();
172+
if (!isDefault(cases[1])) {
173+
elseBody = createIfForEnum(tree, cases[1].getPattern());
182174
}
183-
} else if (isDefault(cases[1])) {
184-
generatedIf = ifElseEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern()));
185-
} else {
186-
generatedIf = ifElseIfEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern()), tree, enumIdentToFieldAccessString(cases[1].getPattern()));
175+
generatedIf = generatedIf
176+
.withElsePart(new J.If.Else(
177+
randomId(),
178+
Space.EMPTY,
179+
Markers.EMPTY,
180+
JRightPadded.build(elseBody)
181+
)
182+
);
187183
}
188-
doAfterVisit(new ShortenFullyQualifiedTypeReferences().getVisitor());
184+
doAfterVisit(ShortenFullyQualifiedTypeReferences.modifyOnly(generatedIf));
189185
} else {
190186
if (cases[1] == null) {
191187
if (isDefault(cases[0])) {
@@ -264,14 +260,39 @@ private String enumIdentToFieldAccessString(Expression casePattern) {
264260
};
265261
}
266262

263+
@NotNull
264+
private static J.If createIfForEnum(Expression expression, Expression enumTree) {
265+
J.If generatedIf;
266+
if (enumTree instanceof J.Identifier) {
267+
enumTree = new J.FieldAccess(
268+
randomId(),
269+
enumTree.getPrefix(),
270+
Markers.EMPTY,
271+
JavaElementFactory.className(enumTree.getType(), true),
272+
JLeftPadded.build(enumTree.withPrefix(Space.EMPTY)),
273+
enumTree.getType()
274+
);
275+
}
276+
J.Binary ifCond = JavaElementFactory.newLogicalExpression(J.Binary.Type.Equal, expression, enumTree);
277+
generatedIf = new J.If(
278+
randomId(),
279+
Space.EMPTY,
280+
Markers.EMPTY,
281+
new J.ControlParentheses<>(randomId(), Space.EMPTY, Markers.EMPTY, JRightPadded.build(ifCond)),
282+
JRightPadded.build(J.Block.createEmptyBlock()),
283+
null
284+
);
285+
return generatedIf;
286+
}
287+
267288
@Value
268289
@With
269290
@AllArgsConstructor
270291
private static class DefaultOnly implements Marker {
271292
UUID id;
272293

273294
public DefaultOnly() {
274-
id = Tree.randomId();
295+
id = randomId();
275296
}
276297
}
277298
}

src/test/java/org/openrewrite/staticanalysis/MinimumSwitchCasesTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ void importsOnEnumImplied() {
494494
java(
495495
"""
496496
import java.time.LocalDate;
497-
497+
498498
class Test {
499499
void test(LocalDate date) {
500500
switch(date.getDayOfWeek()) {
@@ -647,6 +647,38 @@ void doSomethingElse() {}
647647
);
648648
}
649649

650+
@Test
651+
void nestedEnum() {
652+
rewriteRun(
653+
//language=java
654+
java(
655+
"""
656+
class Test {
657+
int test(java.io.ObjectInputFilter filter) {
658+
switch (filter.checkInput(null)) {
659+
case ALLOWED: return 0;
660+
default: return 1;
661+
}
662+
}
663+
}
664+
""",
665+
"""
666+
import java.io.ObjectInputFilter;
667+
668+
class Test {
669+
int test(java.io.ObjectInputFilter filter) {
670+
if (filter.checkInput(null) == ObjectInputFilter.Status.ALLOWED) {
671+
return 0;
672+
} else {
673+
return 1;
674+
}
675+
}
676+
}
677+
"""
678+
)
679+
);
680+
}
681+
650682
@Test
651683
@Issue("https://github.com/openrewrite/rewrite/issues/3076")
652684
void multipleSwitchExpressions() {

0 commit comments

Comments
 (0)