18
18
import org .openrewrite .ExecutionContext ;
19
19
import org .openrewrite .Recipe ;
20
20
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 ;
25
24
import org .openrewrite .java .search .UsesMethod ;
26
25
import org .openrewrite .java .tree .Expression ;
27
26
import org .openrewrite .java .tree .J ;
27
+ import org .openrewrite .java .tree .JavaSourceFile ;
28
28
29
29
import java .time .Duration ;
30
+ import java .util .Collections ;
30
31
import java .util .List ;
31
32
32
33
public class StringFormatted extends Recipe {
@@ -45,7 +46,16 @@ public String getDescription() {
45
46
46
47
@ Override
47
48
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
+ };
49
59
}
50
60
51
61
@ Override
@@ -65,29 +75,27 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext p) {
65
75
String template = String .format (wrapperNotNeeded (arguments .get (0 ))
66
76
? "#{any(java.lang.String)}.formatted(%s)"
67
77
: "(#{any(java.lang.String)}).formatted(%s)" ,
68
- varargsTemplateWithOriginalWhitespace ( arguments ));
78
+ String . join ( ", " , Collections . nCopies ( arguments . size () - 1 , "#{any()}" ) ));
69
79
maybeRemoveImport ("java.lang.String.format" );
70
- return mi .withTemplate (
80
+ mi = mi .withTemplate (
71
81
JavaTemplate .builder (this ::getCursor , template )
72
82
.javaParser (() -> JavaParser .fromJavaVersion ().build ())
73
83
.build (),
74
84
mi .getCoordinates ().replace (),
75
85
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 ;
76
92
}
77
93
78
94
private static boolean wrapperNotNeeded (Expression expression ) {
79
95
return expression instanceof J .Identifier
80
96
|| expression instanceof J .Literal
81
97
|| expression instanceof J .MethodInvocation ;
82
98
}
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
- }
91
99
}
92
100
93
101
@ Override
0 commit comments