[clang-format] do not break before { in JS comments

In JavaScript some @tags can be followed by `{`, and machinery that parses
these comments will fail to understand the comment if followed by a line break.

clang-format already handles this case by not breaking before `{` in comments.
However this was not working in cases when the column limit falls within `@tag`
or between `@tag` and `{`. This adapts clang-format for this case.

Reviewed By: mprobst

Differential Revision: https://reviews.llvm.org/D90908
This commit is contained in:
Krasimir Georgiev 2020-11-06 10:33:23 +01:00
parent 5ee9ef8519
commit 2dbcbd357d
2 changed files with 23 additions and 3 deletions

View File

@ -86,6 +86,18 @@ getCommentSplit(StringRef Text, unsigned ContentStartColumn,
MaxSplitBytes += BytesInChar;
}
// In JavaScript, some @tags can be followed by {, and machinery that parses
// these comments will fail to understand the comment if followed by a line
// break. So avoid ever breaking before a {.
if (Style.Language == FormatStyle::LK_JavaScript) {
StringRef::size_type SpaceOffset =
Text.find_first_of(Blanks, MaxSplitBytes);
if (SpaceOffset != StringRef::npos && SpaceOffset + 1 < Text.size() &&
Text[SpaceOffset + 1] == '{') {
MaxSplitBytes = SpaceOffset + 1;
}
}
StringRef::size_type SpaceOffset = Text.find_last_of(Blanks, MaxSplitBytes);
static const auto kNumberedListRegexp = llvm::Regex("^[1-9][0-9]?\\.");
@ -94,9 +106,7 @@ getCommentSplit(StringRef Text, unsigned ContentStartColumn,
// as a numbered list, which would prevent re-flowing in subsequent passes.
if (kNumberedListRegexp.match(Text.substr(SpaceOffset).ltrim(Blanks)))
SpaceOffset = Text.find_last_of(Blanks, SpaceOffset);
// In JavaScript, some @tags can be followed by {, and machinery that parses
// these comments will fail to understand the comment if followed by a line
// break. So avoid ever breaking before a {.
// Avoid ever breaking before a { in JavaScript.
else if (Style.Language == FormatStyle::LK_JavaScript &&
SpaceOffset + 1 < Text.size() && Text[SpaceOffset + 1] == '{')
SpaceOffset = Text.find_last_of(Blanks, SpaceOffset);

View File

@ -2184,6 +2184,16 @@ TEST_F(FormatTestJS, JSDocAnnotations) {
" * @lala {lala {lalala\n"
" */\n",
getGoogleJSStyleWithColumns(20));
// cases where '{' is around the column limit
for (int ColumnLimit = 6; ColumnLimit < 13; ++ColumnLimit) {
verifyFormat("/**\n"
" * @param {type}\n"
" */",
"/**\n"
" * @param {type}\n"
" */",
getGoogleJSStyleWithColumns(ColumnLimit));
}
verifyFormat("/**\n"
" * @see http://very/very/long/url/is/long\n"
" */",