From 2957b1921d12374364399150b6ca2cd38259299a Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Tue, 6 Oct 2026 04:17:57 -0700 Subject: [PATCH] Strip trailing asterisks before `*/` in Javadoc comments. Decorative closing delimiters such as `/** ... **/` previously had the trailing asterisk retained as comment body content, resulting in `/** ... * */`. PiperOrigin-RevId: 994303609 --- .../java/javadoc/JavadocFormatter.java | 6 +++++- .../java/JavadocFormattingTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/google/googlejavaformat/java/javadoc/JavadocFormatter.java b/core/src/main/java/com/google/googlejavaformat/java/javadoc/JavadocFormatter.java index 86a6786af..0f49edf43 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/javadoc/JavadocFormatter.java +++ b/core/src/main/java/com/google/googlejavaformat/java/javadoc/JavadocFormatter.java @@ -214,7 +214,11 @@ private static boolean oneLineJavadoc(String line, int blockIndent, int maxLineL private static String stripJavadocBeginAndEnd(String input) { checkArgument(input.startsWith("/**"), "Missing /**: %s", input); checkArgument(input.endsWith("*/") && input.length() > 4, "Missing */: %s", input); - return input.substring("/**".length(), input.length() - "*/".length()); + int end = input.length() - "*/".length(); + while (end > "/**".length() && input.charAt(end - 1) == '*') { + end--; + } + return input.substring("/**".length(), end); } /** diff --git a/core/src/test/java/com/google/googlejavaformat/java/JavadocFormattingTest.java b/core/src/test/java/com/google/googlejavaformat/java/JavadocFormattingTest.java index 07f59c4d0..c95358f6c 100644 --- a/core/src/test/java/com/google/googlejavaformat/java/JavadocFormattingTest.java +++ b/core/src/test/java/com/google/googlejavaformat/java/JavadocFormattingTest.java @@ -2519,6 +2519,21 @@ void method() {} assertThat(noJavadocFormatter.formatSource(input)).isEqualTo(input); } + @Test + public void trailingAsterisksBeforeClose() { + String input = + """ + /** Version information for all the QuotaKeys that we have data for **/ + class Test {} + """; + String expected = + """ + /** Version information for all the QuotaKeys that we have data for */ + class Test {} + """; + doFormatTest(input, expected); + } + // TODO: b/346668798 - Test the following Markdown constructs, and make the tests work as needed. // We can assume that the CommonMark parser correctly handles Markdown, so the question is whether // they are subsequently mishandled by our formatting logic. So for example the CommonMark parser