27
27
import org .openrewrite .internal .StringUtils ;
28
28
import org .openrewrite .internal .lang .Nullable ;
29
29
import org .openrewrite .java .MethodMatcher ;
30
- import org .openrewrite .java .tree .Expression ;
31
- import org .openrewrite .java . tree . J ;
30
+ import org .openrewrite .java .tree .* ;
31
+ import org .openrewrite .marker . Markers ;
32
32
import org .openrewrite .semver .DependencyMatcher ;
33
33
34
34
import java .util .List ;
35
+ import java .util .Objects ;
35
36
36
37
import static java .util .Objects .requireNonNull ;
37
38
@@ -50,7 +51,9 @@ public class ChangeDependencyClassifier extends Recipe {
50
51
51
52
@ Option (displayName = "New classifier" ,
52
53
description = "A qualification classifier for the dependency." ,
53
- example = "sources" )
54
+ example = "sources" ,
55
+ required = false )
56
+ @ Nullable
54
57
String newClassifier ;
55
58
56
59
@ Option (displayName = "Dependency configuration" ,
@@ -98,7 +101,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
98
101
String gav = (String ) ((J .Literal ) depArgs .get (0 )).getValue ();
99
102
if (gav != null ) {
100
103
Dependency dependency = DependencyStringNotationConverter .parse (gav );
101
- if (dependency != null && dependency .getVersion () != null && dependency . getClassifier () != null && ! newClassifier .equals (dependency .getClassifier ()) &&
104
+ if (dependency != null && dependency .getVersion () != null && ! Objects .equals (newClassifier , dependency .getClassifier ()) &&
102
105
depMatcher .matches (dependency .getGroupId (), dependency .getArtifactId (), dependency .getVersion ())) {
103
106
Dependency newDependency = dependency .withClassifier (newClassifier );
104
107
m = m .withArguments (ListUtils .mapFirst (m .getArguments (), arg -> ChangeStringLiteral .withStringValue ((J .Literal ) arg , newDependency .toStringNotation ())));
@@ -111,7 +114,10 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
111
114
String version = null ;
112
115
String classifier = null ;
113
116
114
- String classifierStringDelimiter = "'" ;
117
+ String groupDelimiter = "'" ;
118
+ G .MapEntry mapEntry = null ;
119
+ String classifierStringDelimiter = null ;
120
+ int index = 0 ;
115
121
for (Expression e : depArgs ) {
116
122
if (!(e instanceof G .MapEntry )) {
117
123
continue ;
@@ -129,38 +135,61 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
129
135
String valueValue = (String ) value .getValue ();
130
136
if ("group" .equals (keyValue )) {
131
137
groupId = valueValue ;
138
+ if (value .getValueSource () != null ) {
139
+ groupDelimiter = value .getValueSource ().substring (0 , value .getValueSource ().indexOf (valueValue ));
140
+ }
132
141
} else if ("name" .equals (keyValue )) {
142
+ if (index > 0 && mapEntry == null ) {
143
+ mapEntry = arg ;
144
+ }
133
145
artifactId = valueValue ;
134
146
} else if ("version" .equals (keyValue )) {
135
147
version = valueValue ;
136
- } else if ("classifier" .equals (keyValue ) && ! newClassifier . equals ( valueValue ) ) {
148
+ } else if ("classifier" .equals (keyValue )) {
137
149
if (value .getValueSource () != null ) {
138
150
classifierStringDelimiter = value .getValueSource ().substring (0 , value .getValueSource ().indexOf (valueValue ));
139
151
}
140
152
classifierEntry = arg ;
141
153
classifier = valueValue ;
142
154
}
155
+ index ++;
143
156
}
144
157
if (groupId == null || artifactId == null
145
158
|| (version == null && !depMatcher .matches (groupId , artifactId ))
146
159
|| (version != null && !depMatcher .matches (groupId , artifactId , version ))
147
- || classifier == null ) {
160
+ || Objects . equals ( newClassifier , classifier ) ) {
148
161
return m ;
149
162
}
150
- String delimiter = classifierStringDelimiter ;
151
- G .MapEntry finalClassifier = classifierEntry ;
152
- m = m .withArguments (ListUtils .map (m .getArguments (), arg -> {
153
- if (arg == finalClassifier ) {
154
- return finalClassifier .withValue (((J .Literal ) finalClassifier .getValue ())
155
- .withValue (newClassifier )
156
- .withValueSource (delimiter + newClassifier + delimiter ));
163
+
164
+ if (classifier == null ) {
165
+ String delimiter = groupDelimiter ;
166
+ List <Expression > args = m .getArguments ();
167
+ J .Literal keyLiteral = new J .Literal (Tree .randomId (), mapEntry == null ? Space .EMPTY : mapEntry .getKey ().getPrefix (), Markers .EMPTY , "classifier" , "classifier" , null , JavaType .Primitive .String );
168
+ J .Literal valueLiteral = new J .Literal (Tree .randomId (), mapEntry == null ? Space .EMPTY : mapEntry .getValue ().getPrefix (), Markers .EMPTY , newClassifier , delimiter + newClassifier + delimiter , null , JavaType .Primitive .String );
169
+ args .add (new G .MapEntry (Tree .randomId (), mapEntry == null ? Space .EMPTY : mapEntry .getPrefix (), Markers .EMPTY , JRightPadded .build (keyLiteral ), valueLiteral , null ));
170
+ m = m .withArguments (args );
171
+ } else {
172
+ G .MapEntry finalClassifier = classifierEntry ;
173
+ if (newClassifier == null ) {
174
+ m = m .withArguments (ListUtils .map (m .getArguments (), arg -> arg == finalClassifier ? null : arg ));
175
+ } else {
176
+ String delimiter = classifierStringDelimiter ; // `classifierStringDelimiter` cannot be null
177
+ m = m .withArguments (ListUtils .map (m .getArguments (), arg -> {
178
+ if (arg == finalClassifier ) {
179
+ return finalClassifier .withValue (((J .Literal ) finalClassifier .getValue ())
180
+ .withValue (newClassifier )
181
+ .withValueSource (delimiter + newClassifier + delimiter ));
182
+ }
183
+ return arg ;
184
+ }));
157
185
}
158
- return arg ;
159
- }));
186
+ }
187
+
160
188
}
161
189
162
190
return m ;
163
191
}
164
192
});
165
193
}
194
+
166
195
}
0 commit comments