Skip to content

Keep the relative indentation of <pre>{@code} lines written without * - #117

Open
abashev wants to merge 1 commit into
mainfrom
gjf-1476-pre-indent-without-star
Open

abashev wants to merge 1 commit into
mainfrom
gjf-1476-pre-indent-without-star

Conversation

@abashev

@abashev abashev commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator

The defect of google/google-java-format#1476, fixed in this fork's own way: upstream's patch edits JavadocFormatter.classicCommentText, which does not exist here, so the change lives in the lexer.

Problem. With Javadoc formatting on, lines inside <pre>{@code ...} that omit the * margin lost all their leading whitespace, because NEWLINE_PATTERN ate the indentation of every continuation line. The JDK's java.lang.invoke docs are written this way and came out flush left.

Fix. JavadocLexer.stripMargins removes the margins line by line before tokenizing, mirroring upstream's classicCommentText: the * prefix plus one space from lines that have it, and the comment's own indentation from lines that do not. That indentation is min(shortest * prefix, shortest bare-line indentation), so a bare line is never cut into and both kinds of line stay aligned. What is left is relative to the comment, which is what deindentPreCodeBlocks already expects. NEWLINE_PATTERN shrinks to ^[ \t]*\n, the same as upstream's.

HTML comments were the one construct that still saw raw margins (the whole <!-- ... --> is one token). The writer now re-adds the margin to each of their lines, as upstream's writeHtmlComment does, and commentMostlyUntouched takes upstream's current expectation: * abc, * def, * --> instead of the raw *abc. That is the one visible behaviour change outside bare-line code samples; say if the raw form should be kept instead.

Tests first. preCodeWithoutLeadingStarPreservesIndent (upstream's case), preCodeWithoutLeadingStarInIndentedComment (comment indented by four, so the base column really has to go) and preCodeMixedStarAndBareLinesKeepRelativeIndent all failed with the sample flush left. The first and third carry a summary line before <pre>, so they do not depend on the leading-blank-lines fix in #116. Full module suite: 1612 tests, 0 failures.

Blast radius. java.base of JDK 21, 3,474 files, formatted with formatJavadoc(true) by main's jar and this branch's jar: 6 files differ (BootstrapCallInfo, CallSite, MethodHandle, MethodHandles, MutableCallSite, Cleaner), every hunk a bare-line code sample regaining its indentation. The other 3,468 are byte-identical, so the rewritten margin handling changes nothing for * lines.

Only reachable through JavaFormatterOptions.formatJavadoc(true); the CLI and plugins are unaffected.

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