Implement fallback split point for string literals.
authorManuel Klimek <klimek@google.com>
Fri, 1 Mar 2013 13:14:08 +0000 (13:14 +0000)
committerManuel Klimek <klimek@google.com>
Fri, 1 Mar 2013 13:14:08 +0000 (13:14 +0000)
If we don't find a natural split point (currently space) in a string
literal protruding over the line, we just split at the last possible
point.

llvm-svn: 176349

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

index 4aaae844fcadc3f8a6ca1e9c783f5b51aebb560e..d2b12f68148a108b875525925cc5542ca2eb9b10 100644 (file)
@@ -720,6 +720,8 @@ private:
     while (StartColumn + TailLength > getColumnLimit()) {
       StringRef Text = StringRef(Current.FormatTok.Tok.getLiteralData() +
                                  TailOffset, TailLength);
+      if (StartColumn + 1 > getColumnLimit())
+        break;
       StringRef::size_type SplitPoint =
           getSplitPoint(Text, getColumnLimit() - StartColumn - 1);
       if (SplitPoint == StringRef::npos)
@@ -748,8 +750,11 @@ private:
 
   StringRef::size_type
   getSplitPoint(StringRef Text, StringRef::size_type Offset) {
-    // FIXME: Implement more sophisticated splitting mechanism, and a fallback.
-    return Text.rfind(' ', Offset);
+    StringRef::size_type SpaceOffset = Text.rfind(' ', Offset);
+    if (SpaceOffset == StringRef::npos && Offset > 0) {
+      return Offset - 1;
+    }
+    return SpaceOffset;
   }
 
   unsigned getColumnLimit() {
index baeb0143bc328fa28f5d61bf4bfad940761f50dd..8cc81684cb4caa8b86838787d31f8194322bb7c1 100644 (file)
@@ -3003,7 +3003,8 @@ TEST_F(FormatTest, BreakStringLiterals) {
   EXPECT_EQ("\"some \"\n"
             "\"text\"",
             format("\"some text\"", getLLVMStyleWithColumns(7)));
-  EXPECT_EQ("\"some text\"",
+  EXPECT_EQ("\"some\"\n"
+            "\" text\"",
             format("\"some text\"", getLLVMStyleWithColumns(6)));
 
   EXPECT_EQ("variable =\n"
@@ -3041,6 +3042,12 @@ TEST_F(FormatTest, BreakStringLiterals) {
       "aaaaaaaaaaaaaaaaaaaa(\n"
       "    aaaaaaaaaaaaaaaaaaaa,\n"
       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
+
+  EXPECT_EQ(
+      "\"splitmea\"\n"
+      "\"trandompo\"\n"
+      "\"int\"",
+      format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
 }
 
 } // end namespace tooling