From 0690641f83515b0d9329a7529437ee06839b2ef4 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Fri, 1 May 2026 11:46:30 +0200 Subject: [PATCH] Java: fix Javadoc roundtrip for multi-line HTML comments inside block tags `visitComment` consumed `node.getBody().length()` characters of cursor and emitted a single `Javadoc.Text` containing the entire body. For multi-line HTML comments this dropped the leading-line `*` margins on print and left the corresponding `LineBreak` markers stranded in the `lineBreaks` map, where they leaked out as trailing `*` lines before `**/`. Route `DCComment` through the same `visitText(body)` path that `visitDocComment` already uses for top-level HTML comments, so the body's newlines are processed and the margin `LineBreak`s are consumed. --- .../ReloadableJava11JavadocVisitor.java | 2 ++ .../ReloadableJava17JavadocVisitor.java | 2 ++ .../ReloadableJava21JavadocVisitor.java | 2 ++ .../ReloadableJava25JavadocVisitor.java | 2 ++ .../java/ReloadableJava8JavadocVisitor.java | 2 ++ .../org/openrewrite/java/tree/JavadocTest.java | 18 ++++++++++++++++++ 6 files changed, 28 insertions(+) diff --git a/rewrite-java-11/src/main/java/org/openrewrite/java/isolated/ReloadableJava11JavadocVisitor.java b/rewrite-java-11/src/main/java/org/openrewrite/java/isolated/ReloadableJava11JavadocVisitor.java index 7be5a964e8..852262dcb3 100644 --- a/rewrite-java-11/src/main/java/org/openrewrite/java/isolated/ReloadableJava11JavadocVisitor.java +++ b/rewrite-java-11/src/main/java/org/openrewrite/java/isolated/ReloadableJava11JavadocVisitor.java @@ -1158,6 +1158,8 @@ private List convertMultiline(List dts) { js.addAll(whitespaceBefore()); if (dt instanceof DCTree.DCText) { js.addAll(visitText(((DCTree.DCText) dt).getBody())); + } else if (dt instanceof DCTree.DCComment) { + js.addAll(visitText(((DCTree.DCComment) dt).getBody())); } else { js.add((Javadoc) scan(dt, emptyList())); } diff --git a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17JavadocVisitor.java b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17JavadocVisitor.java index 5d2020ce61..be93916fd0 100644 --- a/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17JavadocVisitor.java +++ b/rewrite-java-17/src/main/java/org/openrewrite/java/isolated/ReloadableJava17JavadocVisitor.java @@ -1161,6 +1161,8 @@ private List convertMultiline(List dts) { js.addAll(whitespaceBefore()); if (dt instanceof DCTree.DCText) { js.addAll(visitText(((DCTree.DCText) dt).getBody())); + } else if (dt instanceof DCTree.DCComment) { + js.addAll(visitText(((DCTree.DCComment) dt).getBody())); } else { js.add((Javadoc) scan(dt, emptyList())); } diff --git a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21JavadocVisitor.java b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21JavadocVisitor.java index 51dc244a24..0899cc509c 100644 --- a/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21JavadocVisitor.java +++ b/rewrite-java-21/src/main/java/org/openrewrite/java/isolated/ReloadableJava21JavadocVisitor.java @@ -1196,6 +1196,8 @@ private List convertMultiline(List dts) { js.addAll(whitespaceBefore()); if (dt instanceof DCTree.DCText) { js.addAll(visitText(((DCTree.DCText) dt).getBody())); + } else if (dt instanceof DCTree.DCComment) { + js.addAll(visitText(((DCTree.DCComment) dt).getBody())); } else { js.add((Javadoc) scan(dt, emptyList())); } diff --git a/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25JavadocVisitor.java b/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25JavadocVisitor.java index a1ba0c5d17..9cc0793f80 100644 --- a/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25JavadocVisitor.java +++ b/rewrite-java-25/src/main/java/org/openrewrite/java/isolated/ReloadableJava25JavadocVisitor.java @@ -1339,6 +1339,8 @@ private List convertMultiline(List dts) { js.addAll(visitText(textNode.getBody())); } else if (dt instanceof DCTree.DCRawText rawTextNode) { js.addAll(visitText(rawTextNode.getContent())); + } else if (dt instanceof DCTree.DCComment commentNode) { + js.addAll(visitText(commentNode.getBody())); } else { js.add((Javadoc) scan(dt, emptyList())); } diff --git a/rewrite-java-8/src/main/java/org/openrewrite/java/ReloadableJava8JavadocVisitor.java b/rewrite-java-8/src/main/java/org/openrewrite/java/ReloadableJava8JavadocVisitor.java index 74ab88307a..f7402c0b86 100644 --- a/rewrite-java-8/src/main/java/org/openrewrite/java/ReloadableJava8JavadocVisitor.java +++ b/rewrite-java-8/src/main/java/org/openrewrite/java/ReloadableJava8JavadocVisitor.java @@ -1086,6 +1086,8 @@ private List convertMultiline(List dts) { js.addAll(whitespaceBefore()); if (dt instanceof DCTree.DCText) { js.addAll(visitText(((DCTree.DCText) dt).getBody())); + } else if (dt instanceof DCTree.DCComment) { + js.addAll(visitText(((DCTree.DCComment) dt).getBody())); } else { js.add((Javadoc) scan(dt, emptyList())); } diff --git a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/JavadocTest.java b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/JavadocTest.java index c020151dea..9bad6176e5 100644 --- a/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/JavadocTest.java +++ b/rewrite-java-tck/src/main/java/org/openrewrite/java/tree/JavadocTest.java @@ -224,6 +224,24 @@ class Test { ); } + @Issue("https://github.com/moderneinc/customer-requests/issues/2277") + @Test + void htmlCommentNestedAfterVersionTag() { + rewriteRun( + java( + """ + /** + * @version 0.1 + * + **/ + class Test {} + """ + ) + ); + } + // docRoot @Test void docRoot() {