Preserve hanging indent when breaking line comments.
Summary: If we need to break the second line here: // something: aaaaa aaaaa aaaaaa aaaaa aaaaa // aaaaa aaaaa aaaaaa aaaaa aaaaa aaaaa with the patch it will be turned to // something: aaaaa aaaaa aaaaaa aaaaa aaaaa // aaaaa aaaaa aaaaaa aaaaa aaaaa // aaaaa instead of // something: aaaaa aaaaa aaaaaa aaaaa aaaaa // aaaaa aaaaa aaaaaa aaaaa aaaaa // aaaaa Reviewers: djasper, klimek Reviewed By: klimek CC: cfe-commits, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D2988 llvm-svn: 203458
This commit is contained in:
parent
6fbc619ab9
commit
4504f93901
|
@ -184,19 +184,26 @@ void BreakableStringLiteral::insertBreak(unsigned LineIndex,
|
|||
Prefix, InPPDirective, 1, IndentLevel, LeadingSpaces);
|
||||
}
|
||||
|
||||
static StringRef getLineCommentPrefix(StringRef Comment) {
|
||||
static const char *const KnownPrefixes[] = { "/// ", "///", "// ", "//" };
|
||||
for (size_t i = 0, e = llvm::array_lengthof(KnownPrefixes); i != e; ++i)
|
||||
if (Comment.startswith(KnownPrefixes[i]))
|
||||
return KnownPrefixes[i];
|
||||
return "";
|
||||
static StringRef getLineCommentIndentPrefix(StringRef Comment) {
|
||||
static const char *const KnownPrefixes[] = { "///", "//" };
|
||||
StringRef LongestPrefix;
|
||||
for (StringRef KnownPrefix : KnownPrefixes) {
|
||||
if (Comment.startswith(KnownPrefix)) {
|
||||
size_t PrefixLength = KnownPrefix.size();
|
||||
while (PrefixLength < Comment.size() && Comment[PrefixLength] == ' ')
|
||||
++PrefixLength;
|
||||
if (PrefixLength > LongestPrefix.size())
|
||||
LongestPrefix = Comment.substr(0, PrefixLength);
|
||||
}
|
||||
}
|
||||
return LongestPrefix;
|
||||
}
|
||||
|
||||
BreakableLineComment::BreakableLineComment(
|
||||
const FormatToken &Token, unsigned IndentLevel, unsigned StartColumn,
|
||||
bool InPPDirective, encoding::Encoding Encoding, const FormatStyle &Style)
|
||||
: BreakableSingleLineToken(Token, IndentLevel, StartColumn,
|
||||
getLineCommentPrefix(Token.TokenText), "",
|
||||
getLineCommentIndentPrefix(Token.TokenText), "",
|
||||
InPPDirective, Encoding, Style) {
|
||||
OriginalPrefix = Prefix;
|
||||
if (Token.TokenText.size() > Prefix.size() &&
|
||||
|
|
|
@ -1026,6 +1026,21 @@ TEST_F(FormatTest, SplitsLongCxxComments) {
|
|||
format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
|
||||
EXPECT_EQ("// A comment\n"
|
||||
"// that doesn't\n"
|
||||
"// fit on one\n"
|
||||
"// line",
|
||||
format("// A comment that doesn't fit on one line",
|
||||
getLLVMStyleWithColumns(20)));
|
||||
EXPECT_EQ("/// A comment\n"
|
||||
"/// that doesn't\n"
|
||||
"/// fit on one\n"
|
||||
"/// line",
|
||||
format("/// A comment that doesn't fit on one line",
|
||||
getLLVMStyleWithColumns(20)));
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
|
||||
EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
|
||||
"// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
|
||||
|
|
Loading…
Reference in New Issue