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 f1eab81c6b4..fa33df1c89b 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 @@ -1429,21 +1429,17 @@ private TypeTree mapDimensions(TypeTree baseType, Tree tree, Map annotations = leadingAnnotations(annotationPosTable); int saveCursor = cursor; - whitespace(); - if (source.startsWith("[", cursor)) { - cursor = saveCursor; - JLeftPadded dimension = padLeft(sourceBefore("["), sourceBefore("]")); - return new J.ArrayType( - randomId(), - EMPTY, - Markers.EMPTY, - mapDimensions(baseType, ((JCArrayTypeTree) typeIdent).elemtype, annotationPosTable), - annotations, - dimension, - typeMapping.type(tree) - ); - } + Space space = whitespace(); cursor = saveCursor; + return new J.ArrayType( + randomId(), + EMPTY, + Markers.EMPTY, + mapDimensions(baseType, ((JCArrayTypeTree) typeIdent).elemtype, annotationPosTable), + annotations, + source.startsWith("...", cursor) ? JLeftPadded.build(space) : padLeft(sourceBefore("["), sourceBefore("]")), + typeMapping.type(tree) + ); } return baseType; } diff --git a/rewrite-java-test/src/test/java/org/openrewrite/java/JavaParserTest.java b/rewrite-java-test/src/test/java/org/openrewrite/java/JavaParserTest.java index 03f38b11e9b..8651b8c1619 100644 --- a/rewrite-java-test/src/test/java/org/openrewrite/java/JavaParserTest.java +++ b/rewrite-java-test/src/test/java/org/openrewrite/java/JavaParserTest.java @@ -374,4 +374,70 @@ void filterArtifacts() { .containsOnly(Paths.get("/.m2/repository/org/openrewrite/rewrite-java/8.41.1/rewrite-java-8.41.1.jar")); } + @Test + @Issue("https://github.com/openrewrite/rewrite/issues/3881") + void annotatedVargArgs() { + rewriteRun( + java( + """ + import org.jspecify.annotations.NonNull; + + class C1 { + void m(@NonNull String @NonNull[] arrayArgs) { + } + } + """ + ), + java( + """ + import org.jspecify.annotations.NonNull; + + class C2 { + void m(@NonNull String @NonNull ... varArgs) { + } + } + """ + ), + java( + """ + import org.jspecify.annotations.NonNull; + + class C3 { + void m(String @NonNull[] @NonNull[] arrayArgs) { + } + } + """ + ), + java( + """ + import org.jspecify.annotations.NonNull; + + class C4 { + void m(String @NonNull [ ] @NonNull ... s) { + } + } + """ + ), + java( + """ + import org.jspecify.annotations.NonNull; + + class C5 { + void m(@NonNull String @NonNull[] @NonNull[] arrayArgs) { + } + } + """ + ), + java( + """ + import org.jspecify.annotations.NonNull; + + class C6 { + void m(@NonNull String @NonNull [ ] @NonNull ... s) { + } + } + """ + ) + ); + } } diff --git a/rewrite-java/src/main/java/org/openrewrite/java/JavaPrinter.java b/rewrite-java/src/main/java/org/openrewrite/java/JavaPrinter.java index d75723c2999..e8bf97858f0 100644 --- a/rewrite-java/src/main/java/org/openrewrite/java/JavaPrinter.java +++ b/rewrite-java/src/main/java/org/openrewrite/java/JavaPrinter.java @@ -888,6 +888,13 @@ public J visitVariableDeclarations(VariableDeclarations multiVariable, PrintOutp p.append(']'); } if (multiVariable.getVarargs() != null) { + if (p.out.charAt(p.out.length() - 1) == ']') { + int posToCheck = p.out.length() - 2; + while (p.out.charAt(posToCheck) != '[') { + posToCheck--; + } + p.out.delete(posToCheck, p.out.length()); + } visitSpace(multiVariable.getVarargs(), Space.Location.VARARGS, p); p.append("..."); }