Skip to content

Commit 77f5e85

Browse files
committed
Add UsesJavaVersion 17 applicability test.
1 parent 6e59237 commit 77f5e85

File tree

2 files changed

+215
-160
lines changed

2 files changed

+215
-160
lines changed

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

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
import org.openrewrite.ExecutionContext;
1919
import org.openrewrite.Recipe;
2020
import org.openrewrite.TreeVisitor;
21-
import org.openrewrite.java.JavaParser;
22-
import org.openrewrite.java.JavaTemplate;
23-
import org.openrewrite.java.JavaVisitor;
24-
import org.openrewrite.java.MethodMatcher;
21+
import org.openrewrite.internal.ListUtils;
22+
import org.openrewrite.java.*;
23+
import org.openrewrite.java.search.UsesJavaVersion;
2524
import org.openrewrite.java.search.UsesMethod;
2625
import org.openrewrite.java.tree.Expression;
2726
import org.openrewrite.java.tree.J;
27+
import org.openrewrite.java.tree.JavaSourceFile;
2828

2929
import java.time.Duration;
30+
import java.util.Collections;
3031
import java.util.List;
3132

3233
public class StringFormatted extends Recipe {
@@ -45,7 +46,16 @@ public String getDescription() {
4546

4647
@Override
4748
protected TreeVisitor<?, ExecutionContext> getSingleSourceApplicableTest() {
48-
return new UsesMethod<>(STRING_FORMAT);
49+
return new JavaIsoVisitor<ExecutionContext>() {
50+
@Override
51+
public JavaSourceFile visitJavaSourceFile(JavaSourceFile cu, ExecutionContext executionContext) {
52+
JavaSourceFile sf = (JavaSourceFile) new UsesJavaVersion<ExecutionContext>(17).visit(cu, executionContext);
53+
if (sf != cu) {
54+
doAfterVisit(new UsesMethod<>(STRING_FORMAT));
55+
}
56+
return cu;
57+
}
58+
};
4959
}
5060

5161
@Override
@@ -65,29 +75,27 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext p) {
6575
String template = String.format(wrapperNotNeeded(arguments.get(0))
6676
? "#{any(java.lang.String)}.formatted(%s)"
6777
: "(#{any(java.lang.String)}).formatted(%s)",
68-
varargsTemplateWithOriginalWhitespace(arguments));
78+
String.join(", ", Collections.nCopies(arguments.size() - 1, "#{any()}")));
6979
maybeRemoveImport("java.lang.String.format");
70-
return mi.withTemplate(
80+
mi = mi.withTemplate(
7181
JavaTemplate.builder(this::getCursor, template)
7282
.javaParser(() -> JavaParser.fromJavaVersion().build())
7383
.build(),
7484
mi.getCoordinates().replace(),
7585
arguments.toArray());
86+
if (arguments.size() > 1) {
87+
arguments.remove(0);
88+
mi = maybeAutoFormat(mi, mi.withArguments(
89+
ListUtils.map(mi.getArguments(), (a, b) -> b.withPrefix(arguments.get(a).getPrefix()))), p);
90+
}
91+
return mi;
7692
}
7793

7894
private static boolean wrapperNotNeeded(Expression expression) {
7995
return expression instanceof J.Identifier
8096
|| expression instanceof J.Literal
8197
|| expression instanceof J.MethodInvocation;
8298
}
83-
84-
private static String varargsTemplateWithOriginalWhitespace(List<Expression> arguments) {
85-
StringBuilder stringBuilder = new StringBuilder();
86-
for (Expression expression : arguments.subList(1, arguments.size())) {
87-
stringBuilder.append(expression.getPrefix().format("#{any()},"));
88-
}
89-
return stringBuilder.toString();
90-
}
9199
}
92100

93101
@Override

0 commit comments

Comments
 (0)