1818import lombok .AllArgsConstructor ;
1919import lombok .Value ;
2020import lombok .With ;
21+ import org .jetbrains .annotations .NotNull ;
2122import org .openrewrite .ExecutionContext ;
2223import org .openrewrite .Recipe ;
23- import org .openrewrite .Tree ;
2424import org .openrewrite .TreeVisitor ;
2525import org .openrewrite .internal .ListUtils ;
2626import org .openrewrite .internal .RecipeRunException ;
2929import org .openrewrite .java .ShortenFullyQualifiedTypeReferences ;
3030import org .openrewrite .java .tree .*;
3131import org .openrewrite .marker .Marker ;
32+ import org .openrewrite .marker .Markers ;
3233
3334import java .time .Duration ;
3435import java .util .ArrayList ;
3940import static java .util .Collections .singleton ;
4041import static java .util .Collections .singletonList ;
4142import static java .util .Objects .requireNonNull ;
43+ import static org .openrewrite .Tree .randomId ;
4244
4345public 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}
0 commit comments