Skip to content

Preserve relative indentation in <pre>{@code ...} blocks lacking leading *. - #1476

Merged
copybara-service[bot] merged 1 commit into
masterfrom
test_993625345
Oct 6, 2026
Merged

copybara-service[bot] merged 1 commit into
masterfrom
test_993625345

Conversation

@copybara-service

Copy link
Copy Markdown

Preserve relative indentation in <pre>{@code ...} blocks lacking leading *.

In classic Javadoc, lines inside <pre> blocks that omit the * margin prefix
previously had all leading whitespace stripped via line.stripLeading(),
destroying relative indentation in code samples.

Instead, strip only up to the comment's base indentation column so that
JavadocLexer.deindentPreCodeBlocks can preserve the relative indentation of
the sample.

…ading `*`.

In classic Javadoc, lines inside `<pre>` blocks that omit the `*` margin prefix
previously had all leading whitespace stripped via `line.stripLeading()`,
destroying relative indentation in code samples.

Instead, strip only up to the comment's base indentation column so that
`JavadocLexer.deindentPreCodeBlocks` can preserve the relative indentation of
the sample.

PiperOrigin-RevId: 994305827
@copybara-service
copybara-service Bot merged commit 1f9d2ac into master Oct 6, 2026
12 checks passed
@copybara-service
copybara-service Bot deleted the test_993625345 branch October 6, 2026 11:26
abashev added a commit to openjavaformat/open-java-format that referenced this pull request Oct 9, 2026
…*` (#117)

Lines inside a `<pre>{@code ...}` block that omit the `*` margin lost all
their leading whitespace, because the lexer's newline pattern ate the
indentation of every continuation line. Code samples written this way (the
JDK's java.lang.invoke docs, for one) came out flush left.

The lexer now strips the margins line by line before tokenizing, as upstream
does in JavadocFormatter.classicCommentText: the `*` prefix and the space
after it from lines that have one, and the comment's own indentation from
lines that do not. That indentation is the smaller of the shortest `*` prefix
and the shortest bare-line indentation, so a bare line is never cut into and
both kinds of line stay aligned with each other. What remains is relative to
the comment, which is what deindentPreCodeBlocks expects. The newline pattern
shrinks to the trailing whitespace and the newline itself.

HTML comments were the one construct that still saw the raw margins, so the
writer now puts the margin back on each of their lines, as upstream's does;
commentMostlyUntouched takes upstream's current expectation (`* abc`,
`*   def`, `* -->`) instead of the raw `*abc`.

Resolves the same defect as google/google-java-format#1476, whose patch does
not apply here (no classicCommentText in this fork). Tests first:
preCodeWithoutLeadingStarPreservesIndent (upstream's case),
preCodeWithoutLeadingStarInIndentedComment (comment indented by four, the
base column must go) and preCodeMixedStarAndBareLinesKeepRelativeIndent all
failed with the sample flush left.

java.base of JDK 21 with Javadoc formatting on: 6 of 3,474 files change, all
of them bare-line code samples regaining their indentation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant