Skip to content

Commit a19f33e

Browse files
Improving support for appendArray when going from literal to array, either via single value or a comma-separated list of values
1 parent 5e9803a commit a19f33e

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

rewrite-java-test/src/test/java/org/openrewrite/java/AddOrUpdateAnnotationAttributeTest.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,37 @@ public class A {
6060
);
6161
}
6262

63+
@Test
64+
void literalToListFromSingleValueUsingAppendArray() {
65+
rewriteRun(
66+
spec -> spec.recipe(new AddOrUpdateAnnotationAttribute("org.example.Foo", "bars", "xyz", null, null, true)),
67+
//language=java
68+
java(
69+
"""
70+
package org.example;
71+
public @interface Foo {
72+
String[] bars() default {};
73+
}
74+
"""
75+
),
76+
//language=java
77+
java(
78+
"""
79+
import org.example.Foo;
80+
81+
@Foo(bars = "abc")
82+
public class A {}
83+
""",
84+
"""
85+
import org.example.Foo;
86+
87+
@Foo(bars = {"abc", "xyz"})
88+
public class A {}
89+
"""
90+
)
91+
);
92+
}
93+
6394
@Test
6495
void addValueAttributeClass() {
6596
rewriteRun(
@@ -748,7 +779,7 @@ public class A {
748779
"""
749780
import org.example.Foo;
750781
751-
@Foo(array = {"newTest1", "newTest2"})
782+
@Foo(array = {"oldTest", "newTest1", "newTest2"})
752783
public class A {
753784
}
754785
"""

rewrite-java/src/main/java/org/openrewrite/java/AddOrUpdateAnnotationAttribute.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import static java.util.Collections.*;
3535
import static java.util.Objects.requireNonNull;
3636
import static java.util.stream.Collectors.joining;
37+
import static java.util.stream.Collectors.toList;
3738
import static org.openrewrite.Tree.randomId;
3839
import static org.openrewrite.java.tree.Space.SINGLE_SPACE;
3940
import static org.openrewrite.marker.Markers.EMPTY;
@@ -171,6 +172,16 @@ public J.Annotation visitAnnotation(J.Annotation original, ExecutionContext ctx)
171172
if (!valueMatches(exp, oldAttributeValue) || newAttributeValue.equals(((J.Literal) exp).getValueSource())) {
172173
return as;
173174
}
175+
if (TRUE.equals(appendArray) && attributeIsArray(annotation)) {
176+
List<Expression> updatedList = updateInitializer(annotation, singletonList(as.getAssignment()), getAttributeValues());
177+
Expression flattenedList = createAnnotationLiteralFromString(
178+
annotation,
179+
wrapValues(updatedList.stream()
180+
.map(e -> ((J.Literal) e).getValueSource())
181+
.collect(toList()), true)
182+
);
183+
return as.withAssignment(flattenedList);
184+
}
174185
return as.withAssignment(createAnnotationLiteral(annotation, newAttributeValue));
175186
}
176187
if (exp instanceof J.FieldAccess) {
@@ -246,6 +257,12 @@ private Expression createAnnotationLiteral(J.Annotation annotation, String newAt
246257
.getArguments().get(0);
247258
}
248259

260+
private Expression createAnnotationLiteralFromString(J.Annotation annotation, String updatedAttributeValue) {
261+
//noinspection ConstantConditions
262+
return JavaTemplate.<J.Annotation>apply("#{}", getCursor(), annotation.getCoordinates().replaceArguments(), updatedAttributeValue)
263+
.getArguments().get(0);
264+
}
265+
249266
private J.Assignment createAnnotationAssignment(J.Annotation annotation, String name, @Nullable Object parameter) {
250267
//noinspection ConstantConditions
251268
return (J.Assignment) JavaTemplate.<J.Annotation>apply(name + " = " + (parameter instanceof J ? "#{any()}" : "#{}"), getCursor(), annotation.getCoordinates().replaceArguments(), parameter)
@@ -324,7 +341,14 @@ private List<String> getAttributeValues() {
324341
}
325342

326343
private String getAttributeValuesAsString() {
327-
return getAttributeValues().stream().map(String::valueOf).collect(joining("\", \"", "{\"", "\"}"));
344+
return wrapValues(getAttributeValues(), false);
345+
}
346+
347+
private String wrapValues(List<@Nullable String> values, boolean quoteless) {
348+
if (quoteless) {
349+
return values.stream().map(String::valueOf).collect(joining(", ", "{", "}"));
350+
}
351+
return values.stream().map(String::valueOf).collect(joining("\", \"", "{\"", "\"}"));
328352
}
329353

330354
private static boolean isAnnotationWithOnlyValueMethod(J.Annotation annotation) {

0 commit comments

Comments
 (0)