Skip to content

Commit 78f9ddc

Browse files
authored
Inline JavaTemplate fields at call sites (#844)
Replace stored JavaTemplate fields with inline builder chains across 8 recipes, eliminating unnecessary visitor state.
1 parent 3f3cd50 commit 78f9ddc

8 files changed

Lines changed: 54 additions & 84 deletions

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

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,6 @@ public class BigDecimalRoundingConstantsToEnums extends Recipe {
5050
@Override
5151
public TreeVisitor<?, ExecutionContext> getVisitor() {
5252
return Preconditions.check(new UsesType<>("java.math.BigDecimal", false), new JavaIsoVisitor<ExecutionContext>() {
53-
private final JavaTemplate twoArgDivide = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{}")
54-
.contextSensitive()
55-
.imports("java.math.RoundingMode")
56-
.build();
57-
58-
private final JavaTemplate twoArgScale = JavaTemplate.builder("#{any(int)}, #{}")
59-
.contextSensitive()
60-
.imports("java.math.RoundingMode")
61-
.build();
62-
63-
private final JavaTemplate threeArg = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{any(int)}, #{}")
64-
.contextSensitive()
65-
.imports("java.math.RoundingMode").build();
66-
6753
@Override
6854
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
6955
J.MethodInvocation m = super.visitMethodInvocation(method, ctx);
@@ -73,22 +59,34 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
7359
if (roundingModeEnum == null) {
7460
return m;
7561
}
76-
m = twoArgDivide.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum);
62+
m = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{}")
63+
.contextSensitive()
64+
.imports("java.math.RoundingMode")
65+
.build()
66+
.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum);
7767
maybeAddImport("java.math.RoundingMode");
7868
} else if (BIG_DECIMAL_SET_SCALE.matches(m) && isConvertibleBigDecimalConstant(m.getArguments().get(1))) {
7969
String roundingModeEnum = getTemplateText(m.getArguments().get(1));
8070
if (roundingModeEnum == null) {
8171
return m;
8272
}
83-
m = twoArgScale.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum);
73+
m = JavaTemplate.builder("#{any(int)}, #{}")
74+
.contextSensitive()
75+
.imports("java.math.RoundingMode")
76+
.build()
77+
.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum);
8478
maybeAddImport("java.math.RoundingMode");
8579
} else if (BIG_DECIMAL_DIVIDE_WITH_SCALE.matches(m) &&
8680
isConvertibleBigDecimalConstant(m.getArguments().get(2))) {
8781
String roundingModeEnum = getTemplateText(m.getArguments().get(2));
8882
if (roundingModeEnum == null) {
8983
return m;
9084
}
91-
m = threeArg.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum);
85+
m = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{any(int)}, #{}")
86+
.contextSensitive()
87+
.imports("java.math.RoundingMode")
88+
.build()
89+
.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum);
9290
maybeAddImport("java.math.RoundingMode");
9391
}
9492
return m;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
@AllArgsConstructor
4848
public class EmptyBlockVisitor<P> extends JavaIsoVisitor<P> {
4949
private EmptyBlockStyle emptyBlockStyle;
50-
private final JavaTemplate continueStatement = JavaTemplate.builder("continue;").build();
5150

5251
@Override
5352
public @Nullable J visit(@Nullable Tree tree, P p) {
@@ -64,7 +63,8 @@ public J.WhileLoop visitWhileLoop(J.WhileLoop whileLoop, P p) {
6463

6564
if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) {
6665
J.Block body = (J.Block) w.getBody();
67-
w = continueStatement.apply(updateCursor(w), body.getCoordinates().lastStatement());
66+
w = JavaTemplate.builder("continue;").build()
67+
.apply(updateCursor(w), body.getCoordinates().lastStatement());
6868
}
6969

7070
return w;
@@ -76,7 +76,8 @@ public J.DoWhileLoop visitDoWhileLoop(J.DoWhileLoop doWhileLoop, P p) {
7676

7777
if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) {
7878
J.Block body = (J.Block) w.getBody();
79-
w = continueStatement.apply(updateCursor(w), body.getCoordinates().lastStatement());
79+
w = JavaTemplate.builder("continue;").build()
80+
.apply(updateCursor(w), body.getCoordinates().lastStatement());
8081
}
8182

8283
return w;

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,16 @@ public class ExplicitCharsetOnStringGetBytes extends Recipe {
5151
@Override
5252
public TreeVisitor<?, ExecutionContext> getVisitor() {
5353
return Preconditions.check(new UsesMethod<>(GET_BYTES), new JavaIsoVisitor<ExecutionContext>() {
54-
final JavaTemplate WITH_ENCODING = JavaTemplate
55-
.builder("getBytes(StandardCharsets.#{})")
56-
.contextSensitive()
57-
.imports("java.nio.charset.StandardCharsets")
58-
.build();
59-
6054
@Override
6155
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
6256
J.MethodInvocation m = super.visitMethodInvocation(method, ctx);
6357
if (GET_BYTES.matches(method)) {
6458
maybeAddImport("java.nio.charset.StandardCharsets");
65-
m = WITH_ENCODING.apply(updateCursor(m), m.getCoordinates().replaceMethod(), encoding == null ? "UTF_8" : encoding);
59+
m = JavaTemplate.builder("getBytes(StandardCharsets.#{})")
60+
.contextSensitive()
61+
.imports("java.nio.charset.StandardCharsets")
62+
.build()
63+
.apply(updateCursor(m), m.getCoordinates().replaceMethod(), encoding == null ? "UTF_8" : encoding);
6664
}
6765
return m;
6866
}

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

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -55,34 +55,6 @@ public class MinimumSwitchCases extends Recipe {
5555
@Override
5656
public TreeVisitor<?, ExecutionContext> getVisitor() {
5757
return Preconditions.check(Preconditions.not(new CSharpFileChecker<>()), new JavaVisitor<ExecutionContext>() {
58-
final JavaTemplate ifElseIfPrimitive = JavaTemplate.builder("" +
59-
"if(#{any()} == #{any()}) {\n" +
60-
"} else if(#{any()} == #{any()}) {\n" +
61-
"}").build();
62-
63-
final JavaTemplate ifElseIfString = JavaTemplate.builder("" +
64-
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
65-
"} else if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
66-
"}").build();
67-
68-
final JavaTemplate ifElsePrimitive = JavaTemplate.builder("" +
69-
"if(#{any()} == #{any()}) {\n" +
70-
"} else {\n" +
71-
"}").build();
72-
73-
final JavaTemplate ifElseString = JavaTemplate.builder("" +
74-
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
75-
"} else {\n" +
76-
"}").build();
77-
78-
final JavaTemplate ifPrimitive = JavaTemplate.builder("" +
79-
"if(#{any()} == #{any()}) {\n" +
80-
"}").build();
81-
82-
final JavaTemplate ifString = JavaTemplate.builder("" +
83-
"if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" +
84-
"}").build();
85-
8658
@Override
8759
public J visitBlock(J.Block block, ExecutionContext ctx) {
8860
// Handle the edge case of the extra-pointless switch statement which contains _only_ the default case
@@ -147,11 +119,14 @@ public J visitSwitch(J.Switch switch_, ExecutionContext ctx) {
147119
if (isDefault(cases[0])) {
148120
return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly()));
149121
}
150-
generatedIf = ifString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree);
122+
generatedIf = JavaTemplate.builder("if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n}").build()
123+
.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree);
151124
} else if (isDefault(cases[1])) {
152-
generatedIf = ifElseString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree);
125+
generatedIf = JavaTemplate.builder("if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n} else {\n}").build()
126+
.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree);
153127
} else {
154-
generatedIf = ifElseIfString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree, cases[1].getPattern(), tree);
128+
generatedIf = JavaTemplate.builder("if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n} else if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n}").build()
129+
.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree, cases[1].getPattern(), tree);
155130
}
156131
} else if (switchesOnEnum(switch_)) {
157132
if (cases[1] == null && isDefault(cases[0])) {
@@ -179,11 +154,14 @@ public J visitSwitch(J.Switch switch_, ExecutionContext ctx) {
179154
if (isDefault(cases[0])) {
180155
return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly()));
181156
}
182-
generatedIf = ifPrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern());
157+
generatedIf = JavaTemplate.builder("if(#{any()} == #{any()}) {\n}").build()
158+
.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern());
183159
} else if (isDefault(cases[1])) {
184-
generatedIf = ifElsePrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern());
160+
generatedIf = JavaTemplate.builder("if(#{any()} == #{any()}) {\n} else {\n}").build()
161+
.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern());
185162
} else {
186-
generatedIf = ifElseIfPrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern(), tree, cases[1].getPattern());
163+
generatedIf = JavaTemplate.builder("if(#{any()} == #{any()}) {\n} else if(#{any()} == #{any()}) {\n}").build()
164+
.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern(), tree, cases[1].getPattern());
187165
}
188166
}
189167

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ public class SimplifyBooleanReturn extends Recipe {
5454
@Override
5555
public TreeVisitor<?, ExecutionContext> getVisitor() {
5656
return new JavaVisitor<ExecutionContext>() {
57-
private final JavaTemplate notIfConditionReturn = JavaTemplate.builder("return !(#{any(boolean)});")
58-
.build();
59-
private final JavaTemplate plainReturn = JavaTemplate.builder("return #{any(boolean)};")
60-
.build();
61-
6257
@Override
6358
public J visitIf(J.If iff, ExecutionContext ctx) {
6459
J.If i = visitAndCast(iff, ctx, super::visitIf);
@@ -119,10 +114,14 @@ public J visitIf(J.If iff, ExecutionContext ctx) {
119114
if (ifCondition instanceof J.Unary) {
120115
J.Unary u = (J.Unary) ifCondition;
121116
if (u.getOperator() == J.Unary.Type.Not) {
122-
return plainReturn.apply(updateCursor(i), i.getCoordinates().replace(), u.getExpression());
117+
return JavaTemplate.builder("return #{any(boolean)};")
118+
.build()
119+
.apply(updateCursor(i), i.getCoordinates().replace(), u.getExpression());
123120
}
124121
}
125-
return notIfConditionReturn.apply(updateCursor(i), i.getCoordinates().replace(), ifCondition);
122+
return JavaTemplate.builder("return !(#{any(boolean)});")
123+
.build()
124+
.apply(updateCursor(i), i.getCoordinates().replace(), ifCondition);
126125
}
127126
}
128127
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ public class SimplifyConsecutiveAssignments extends Recipe {
4141
@Override
4242
public TreeVisitor<?, ExecutionContext> getVisitor() {
4343
return new JavaIsoVisitor<ExecutionContext>() {
44-
// TODO if we had a `replace()` coordinate on every `Expression`, we wouldn't need the left side of this
45-
final JavaTemplate combinedAssignment = JavaTemplate
46-
.builder("o = (#{any()} #{} #{any()});")
47-
.build();
48-
4944
@Override
5045
public J.Block visitBlock(J.Block block, ExecutionContext ctx) {
5146
J.Block b = super.visitBlock(block, ctx);
@@ -180,12 +175,15 @@ private Statement combine(Cursor cursor, String op, Expression right) {
180175
Statement s = cursor.getValue();
181176
if (s instanceof J.Assignment) {
182177
J.Assignment assign = (J.Assignment) s;
183-
J.Assignment after = combinedAssignment.apply(cursor, s.getCoordinates().replace(), assign.getAssignment(), op, right);
178+
// TODO if we had a `replace()` coordinate on every `Expression`, we wouldn't need the left side of this
179+
J.Assignment after = JavaTemplate.builder("o = (#{any()} #{} #{any()});").build()
180+
.apply(cursor, s.getCoordinates().replace(), assign.getAssignment(), op, right);
184181
return assign.withAssignment(after.getAssignment());
185182
}
186183
if (s instanceof J.VariableDeclarations) {
187184
J.VariableDeclarations variables = (J.VariableDeclarations) s;
188-
J.Assignment after = combinedAssignment.apply(cursor, s.getCoordinates().replace(), variables.getVariables().get(0).getInitializer(), op, right);
185+
J.Assignment after = JavaTemplate.builder("o = (#{any()} #{} #{any()});").build()
186+
.apply(cursor, s.getCoordinates().replace(), variables.getVariables().get(0).getInitializer(), op, right);
189187
return variables.withVariables(ListUtils.map(variables.getVariables(), (i, namedVar) -> i == 0 ?
190188
namedVar.withInitializer(after.getAssignment()) : namedVar));
191189
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,6 @@ public class SortedSetStreamToLinkedHashSet extends Recipe {
4242
@Override
4343
public TreeVisitor<?, ExecutionContext> getVisitor() {
4444
return Preconditions.check(new UsesMethod<>(COLLECTORS_TO_SET_METHOD_MATCHER), new JavaIsoVisitor<ExecutionContext>() {
45-
private final JavaTemplate template = JavaTemplate.builder("Collectors.toCollection(LinkedHashSet::new)")
46-
.imports("java.util.stream.Collectors", "java.util.LinkedHashSet")
47-
.build();
48-
4945
@Override
5046
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
5147
J.MethodInvocation mi = super.visitMethodInvocation(method, ctx);
@@ -55,7 +51,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
5551
maybeRemoveImport("java.util.stream.Collectors.toSet");
5652
maybeAddImport("java.util.LinkedHashSet");
5753
maybeAddImport("java.util.stream.Collectors");
58-
return template.apply(updateCursor(mi), mi.getCoordinates().replaceArguments());
54+
return JavaTemplate.builder("Collectors.toCollection(LinkedHashSet::new)")
55+
.imports("java.util.stream.Collectors", "java.util.LinkedHashSet")
56+
.build()
57+
.apply(updateCursor(mi), mi.getCoordinates().replaceArguments());
5958
}
6059
return mi;
6160
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,15 @@ public class WhileInsteadOfFor extends Recipe {
4141
@Override
4242
public TreeVisitor<?, ExecutionContext> getVisitor() {
4343
return new JavaVisitor<ExecutionContext>() {
44-
final JavaTemplate whileLoop = JavaTemplate.builder("while(#{any(boolean)}) {}")
45-
.build();
46-
4744
@Override
4845
public J visitForLoop(J.ForLoop forLoop, ExecutionContext ctx) {
4946
if (forLoop.getControl().getInit().get(0) instanceof J.Empty &&
5047
forLoop.getControl().getUpdate().get(0) instanceof J.Empty &&
5148
!(forLoop.getControl().getCondition() instanceof J.Empty)
5249
) {
53-
J.WhileLoop w = whileLoop.apply(getCursor(), forLoop.getCoordinates().replace(), forLoop.getControl().getCondition());
50+
J.WhileLoop w = JavaTemplate.builder("while(#{any(boolean)}) {}")
51+
.build()
52+
.apply(getCursor(), forLoop.getCoordinates().replace(), forLoop.getControl().getCondition());
5453
return w.withBody(forLoop.getBody());
5554
}
5655
return super.visitForLoop(forLoop, ctx);

0 commit comments

Comments
 (0)