[PATCH] Preserve hanging indent when breaking line comments.

Alexander Kornienko alexfh at google.com
Thu Mar 6 08:22:23 PST 2014


Hi djasper,

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

http://llvm-reviews.chandlerc.com/D2988

Files:
  lib/Format/BreakableToken.cpp
  unittests/Format/FormatTest.cpp

Index: lib/Format/BreakableToken.cpp
===================================================================
--- lib/Format/BreakableToken.cpp
+++ lib/Format/BreakableToken.cpp
@@ -185,11 +185,20 @@
 }
 
 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 const char *const KnownPrefixes[] = {
+    "///                                                        ",
+    "//                                                         "
+  };
+  StringRef LongestPrefix;
+  for (const char *KnownPrefix : KnownPrefixes) {
+    size_t PrefixLength = 0;
+    while (PrefixLength < Comment.size() && KnownPrefix[PrefixLength] &&
+           KnownPrefix[PrefixLength] == Comment[PrefixLength])
+      ++PrefixLength;
+    if (PrefixLength > LongestPrefix.size())
+      LongestPrefix = StringRef(KnownPrefix, PrefixLength);
+  }
+  return LongestPrefix;
 }
 
 BreakableLineComment::BreakableLineComment(
Index: unittests/Format/FormatTest.cpp
===================================================================
--- unittests/Format/FormatTest.cpp
+++ unittests/Format/FormatTest.cpp
@@ -1026,6 +1026,15 @@
       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)));
+}
+
 TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
   EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
             "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2988.1.patch
Type: text/x-patch
Size: 1944 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140306/f14bec9e/attachment.bin>


More information about the cfe-commits mailing list