From d6b36350630002c603302efc78bbeb39633ba694 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Mon, 10 Mar 2014 13:14:56 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203458 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/BreakableToken.cpp | 21 ++++++++++++++------- unittests/Format/FormatTest.cpp | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/Format/BreakableToken.cpp b/lib/Format/BreakableToken.cpp index 03693c62bb..d43a774c9c 100644 --- a/lib/Format/BreakableToken.cpp +++ b/lib/Format/BreakableToken.cpp @@ -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() && diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 6690103dc1..ad1ad04160 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -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" -- 2.40.0