Implements breaking string literals at slashes.
authorManuel Klimek <klimek@google.com>
Fri, 1 Mar 2013 13:29:19 +0000 (13:29 +0000)
committerManuel Klimek <klimek@google.com>
Fri, 1 Mar 2013 13:29:19 +0000 (13:29 +0000)
We now break at a slash if we do not find a space to break on.

Also fixes a bug where we would go over the limit when breaking the
second line.

llvm-svn: 176350

clang/lib/Format/Format.cpp
clang/unittests/Format/FormatTest.cpp

index d2b12f6..01813ef 100644 (file)
@@ -720,10 +720,10 @@ private:
     while (StartColumn + TailLength > getColumnLimit()) {
       StringRef Text = StringRef(Current.FormatTok.Tok.getLiteralData() +
                                  TailOffset, TailLength);
-      if (StartColumn + 1 > getColumnLimit())
+      if (StartColumn + OffsetFromStart + 1 > getColumnLimit())
         break;
-      StringRef::size_type SplitPoint =
-          getSplitPoint(Text, getColumnLimit() - StartColumn - 1);
+      StringRef::size_type SplitPoint = getSplitPoint(
+          Text, getColumnLimit() - StartColumn - OffsetFromStart - 1);
       if (SplitPoint == StringRef::npos)
         break;
       assert(SplitPoint != 0);
@@ -751,10 +751,15 @@ private:
   StringRef::size_type
   getSplitPoint(StringRef Text, StringRef::size_type Offset) {
     StringRef::size_type SpaceOffset = Text.rfind(' ', Offset);
-    if (SpaceOffset == StringRef::npos && Offset > 0) {
+    if (SpaceOffset != StringRef::npos)
+      return SpaceOffset;
+    StringRef::size_type SlashOffset = Text.rfind('/', Offset);
+    if (SlashOffset != StringRef::npos)
+      return SlashOffset;
+    if (Offset > 1)
+      // Do not split at 0.
       return Offset - 1;
-    }
-    return SpaceOffset;
+    return StringRef::npos;
   }
 
   unsigned getColumnLimit() {
index 8cc8168..8b1f69a 100644 (file)
@@ -3045,9 +3045,15 @@ TEST_F(FormatTest, BreakStringLiterals) {
 
   EXPECT_EQ(
       "\"splitmea\"\n"
-      "\"trandompo\"\n"
-      "\"int\"",
+      "\"trandomp\"\n"
+      "\"oint\"",
       format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
+
+  EXPECT_EQ(
+      "\"split/\"\n"
+      "\"pathat/\"\n"
+      "\"slashes\"",
+      format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
 }
 
 } // end namespace tooling