diff --git a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java index b297f34ba9..6b76461427 100644 --- a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java +++ b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17ParserVisitor.java @@ -133,9 +133,10 @@ public J visitAnnotation(AnnotationTree node, Space fmt) { List> expressions; if (node.getArguments().size() == 1) { ExpressionTree arg = node.getArguments().get(0); - if (arg instanceof JCAssign) { - if (endPos(arg) < 0) { - expressions = singletonList(convert(((JCAssign) arg).rhs, t -> sourceBefore(")"))); + if (arg instanceof JCAssign assign && assign.lhs instanceof JCIdent) { + // javac's `Annotate#enterAnnotation` builds an elided `value =` with `make.at(rhs.pos)` + if (assign.lhs.pos == assign.rhs.pos) { + expressions = singletonList(convert(assign.rhs, t -> sourceBefore(")"))); } else { expressions = singletonList(convert(arg, t -> sourceBefore(")"))); } diff --git a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java index b9aa770406..a32a4b6fd2 100644 --- a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java +++ b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21ParserVisitor.java @@ -135,9 +135,10 @@ public J visitAnnotation(AnnotationTree node, Space fmt) { List> expressions; if (node.getArguments().size() == 1) { ExpressionTree arg = node.getArguments().get(0); - if (arg instanceof JCAssign) { - if (endPos(arg) < 0) { - expressions = singletonList(convert(((JCAssign) arg).rhs, t -> sourceBefore(")"))); + if (arg instanceof JCAssign assign && assign.lhs instanceof JCIdent) { + // javac's `Annotate#enterAnnotation` builds an elided `value =` with `make.at(rhs.pos)` + if (assign.lhs.pos == assign.rhs.pos) { + expressions = singletonList(convert(assign.rhs, t -> sourceBefore(")"))); } else { expressions = singletonList(convert(arg, t -> sourceBefore(")"))); } diff --git a/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25ParserVisitor.java b/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25ParserVisitor.java index 091f32a31e..5b13c454a9 100644 --- a/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25ParserVisitor.java +++ b/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25ParserVisitor.java @@ -136,9 +136,10 @@ public J visitAnnotation(AnnotationTree node, Space fmt) { List> expressions; if (node.getArguments().size() == 1) { ExpressionTree arg = node.getArguments().get(0); - if (arg instanceof JCAssign) { - if (endPos(arg) < 0) { - expressions = singletonList(convert(((JCAssign) arg).rhs, t -> sourceBefore(")"))); + if (arg instanceof JCAssign assign && assign.lhs instanceof JCIdent) { + // javac's `Annotate#enterAnnotation` builds an elided `value =` with `make.at(rhs.pos)` + if (assign.lhs.pos == assign.rhs.pos) { + expressions = singletonList(convert(assign.rhs, t -> sourceBefore(")"))); } else { expressions = singletonList(convert(arg, t -> sourceBefore(")"))); } diff --git a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/AnnotationTest.java b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/AnnotationTest.java index 8d7f2b490d..da7790bc69 100644 --- a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/AnnotationTest.java +++ b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/AnnotationTest.java @@ -58,6 +58,23 @@ public class A {} ); } + @Test + void annotationWithDefaultArgumentNamedLikeTheAttribute() { + rewriteRun( + java( + """ + class A { + static final String value = "ALL"; + + @SuppressWarnings(value) + void m() { + } + } + """ + ) + ); + } + @Test void annotationWithArgument() { rewriteRun( diff --git a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/RecordTest.java b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/RecordTest.java index 7f5764f6d3..aaf9d5207f 100644 --- a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/RecordTest.java +++ b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/RecordTest.java @@ -124,6 +124,60 @@ public record JavaRecord(String name, @Deprecated int age) { ); } + @Issue("https://github.com/openrewrite/rewrite/issues/8723") + @Test + void namedAttributeAnnotationOnComponent() { + rewriteRun( + java( + """ + import java.lang.annotation.ElementType; + import java.lang.annotation.Target; + + @Target({ElementType.PARAMETER, ElementType.RECORD_COMPONENT}) + @interface A { + String value(); + } + """ + ), + java( + """ + public record MyRecord(@A(value = "a") String name) { + } + """ + ), + java( + """ + public record MyRecordWithBlanks( @A( /* don't trip */ value = "a" ) String name) { + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite/issues/8723") + @Test + void namedAttributeAnnotationOnComponentFollowedByAdditionalSource() { + rewriteRun( + java( + """ + import java.lang.annotation.ElementType; + import java.lang.annotation.Target; + + @Target({ElementType.PARAMETER, ElementType.RECORD_COMPONENT}) + @interface A { + String value(); + } + """ + ), + java( + """ + public record MyRecord(@A(value = "a") String name, int age) { + } + """ + ) + ); + } + @Issue("https://github.com/openrewrite/rewrite/issues/6401") @Test void annotationsAndRecords() {