Skip to content

Commit

Permalink
[clang-format] Use wider comment prefix space rule
Browse files Browse the repository at this point in the history
This commit changes the condition of requiring comment to start with
alphanumeric characters to make no change only for a certain set of
characters, currently horizontal whitespace and punctuation characters,
to support wider set of leading characters unrelated to documentation
generation directives.

Reviewed By: HazardyKnusperkeks
Differential Revision: https://reviews.llvm.org/D118869
  • Loading branch information
ksyx committed Feb 3, 2022
1 parent a5cff6a commit 88e4e6b
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 2 deletions.
18 changes: 16 additions & 2 deletions clang/lib/Format/BreakableToken.cpp
Expand Up @@ -771,6 +771,20 @@ BreakableLineCommentSection::BreakableLineCommentSection(
OriginalPrefix[i] = IndentPrefix;
const unsigned SpacesInPrefix = llvm::count(IndentPrefix, ' ');

// This lambda also considers multibyte character that is not handled in
// functions like isPunctuation provided by CharInfo.
const auto NoSpaceBeforeFirstCommentChar = [&]() {
assert(Lines[i].size() > IndentPrefix.size());
const char FirstCommentChar = Lines[i][IndentPrefix.size()];
const unsigned FirstCharByteSize =
encoding::getCodePointNumBytes(FirstCommentChar, Encoding);
return encoding::columnWidth(
Lines[i].substr(IndentPrefix.size(), FirstCharByteSize),
Encoding) == 1 &&
(FirstCommentChar == '\\' || isPunctuation(FirstCommentChar) ||
isHorizontalWhitespace(FirstCommentChar));
};

// On the first line of the comment section we calculate how many spaces
// are to be added or removed, all lines after that just get only the
// change and we will not look at the maximum anymore. Additionally to the
Expand All @@ -780,7 +794,7 @@ BreakableLineCommentSection::BreakableLineCommentSection(
OriginalPrefix[i - 1].rtrim(Blanks)) {
if (SpacesInPrefix < Style.SpacesInLineCommentPrefix.Minimum &&
Lines[i].size() > IndentPrefix.size() &&
isAlphanumeric(Lines[i][IndentPrefix.size()])) {
!NoSpaceBeforeFirstCommentChar()) {
FirstLineSpaceChange =
Style.SpacesInLineCommentPrefix.Minimum - SpacesInPrefix;
} else if (SpacesInPrefix > Style.SpacesInLineCommentPrefix.Maximum) {
Expand All @@ -804,7 +818,7 @@ BreakableLineCommentSection::BreakableLineCommentSection(
const auto FirstNonSpace = Lines[i][IndentPrefix.size()];
const auto AllowsSpaceChange =
SpacesInPrefix != 0 ||
(isAlphanumeric(FirstNonSpace) ||
(!NoSpaceBeforeFirstCommentChar() ||
(FirstNonSpace == '}' && FirstLineSpaceChange != 0));

if (PrefixSpaceChange[i] > 0 && AllowsSpaceChange) {
Expand Down
84 changes: 84 additions & 0 deletions clang/unittests/Format/FormatTestComments.cpp
Expand Up @@ -3322,6 +3322,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"/// Free Doxygen with 3 spaces\n"
"\n"
"//🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"// 🐉 Another nice dragon\n"
"\n"
"// \t Three leading spaces following tab\n"
"\n"
"// \\t Three leading spaces following backslash\n"
"\n"
"/// A Doxygen Comment with a nested list:\n"
"/// - Foo\n"
"/// - Bar\n"
Expand Down Expand Up @@ -3381,6 +3393,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"/// Free Doxygen with 3 spaces\n"
"\n"
"// 🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"// 🐉 Another nice dragon\n"
"\n"
"// \t Three leading spaces following tab\n"
"\n"
"// \\t Three leading spaces following backslash\n"
"\n"
"/// A Doxygen Comment with a nested list:\n"
"/// - Foo\n"
"/// - Bar\n"
Expand Down Expand Up @@ -3442,6 +3466,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"///Free Doxygen with 3 spaces\n"
"\n"
"//🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"//🐉 Another nice dragon\n"
"\n"
"//\t Three leading spaces following tab\n"
"\n"
"//\\t Three leading spaces following backslash\n"
"\n"
"///A Doxygen Comment with a nested list:\n"
"///- Foo\n"
"///- Bar\n"
Expand Down Expand Up @@ -3503,6 +3539,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"/// Free Doxygen with 3 spaces\n"
"\n"
"// 🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"// 🐉 Another nice dragon\n"
"\n"
"// \t Three leading spaces following tab\n"
"\n"
"// \\t Three leading spaces following backslash\n"
"\n"
"/// A Doxygen Comment with a nested list:\n"
"/// - Foo\n"
"/// - Bar\n"
Expand Down Expand Up @@ -3809,6 +3857,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"/// Free Doxygen with 3 spaces\n"
"\n"
"// 🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"// 🐉 Another nice dragon\n"
"\n"
"// \t Three leading spaces following tab\n"
"\n"
"// \\t Three leading spaces following backslash\n"
"\n"
"/// A Doxygen Comment with a nested list:\n"
"/// - Foo\n"
"/// - Bar\n"
Expand Down Expand Up @@ -3870,6 +3930,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"///Free Doxygen with 3 spaces\n"
"\n"
"//🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"//🐉 Another nice dragon\n"
"\n"
"//\t Three leading spaces following tab\n"
"\n"
"//\\t Three leading spaces following backslash\n"
"\n"
"///A Doxygen Comment with a nested list:\n"
"///- Foo\n"
"///- Bar\n"
Expand Down Expand Up @@ -3931,6 +4003,18 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"\n"
"/// Free Doxygen with 3 spaces\n"
"\n"
"// 🐉 A nice dragon\n"
"\n"
"//\t abccba\n"
"\n"
"//\\t deffed\n"
"\n"
"// 🐉 Another nice dragon\n"
"\n"
"// \t Three leading spaces following tab\n"
"\n"
"// \\t Three leading spaces following backslash\n"
"\n"
"/// A Doxygen Comment with a nested list:\n"
"/// - Foo\n"
"/// - Bar\n"
Expand Down

0 comments on commit 88e4e6b

Please sign in to comment.