From 7285207486d19a02ebbec9f75268f30479c55801 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Wed, 19 Jun 2013 14:22:47 +0000 Subject: [PATCH] Split long strings on word boundaries. Summary: Split strings at word boundaries, when there are no spaces and slashes. Reviewers: klimek CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1003 llvm-svn: 184304 --- clang/lib/Format/BreakableToken.cpp | 5 +++++ clang/unittests/Format/FormatTest.cpp | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/clang/lib/Format/BreakableToken.cpp b/clang/lib/Format/BreakableToken.cpp index 48c1dee5bd7f..2b559cf8c3a2 100644 --- a/clang/lib/Format/BreakableToken.cpp +++ b/clang/lib/Format/BreakableToken.cpp @@ -77,6 +77,7 @@ BreakableToken::Split getStringSplit(StringRef Text, encoding::getCodePointCount(Text, Encoding) - 1); StringRef::size_type SpaceOffset = 0; StringRef::size_type SlashOffset = 0; + StringRef::size_type WordStartOffset = 0; StringRef::size_type SplitPoint = 0; for (unsigned Chars = 0;;) { unsigned Advance; @@ -95,6 +96,8 @@ BreakableToken::Split getStringSplit(StringRef Text, SpaceOffset = SplitPoint; if (Text[0] == '/') SlashOffset = SplitPoint; + if (Text[0] != '\\' && !isAlphanumeric(Text[0])) + WordStartOffset = SplitPoint; SplitPoint += Advance; Text = Text.substr(Advance); @@ -104,6 +107,8 @@ BreakableToken::Split getStringSplit(StringRef Text, return BreakableToken::Split(SpaceOffset + 1, 0); if (SlashOffset != 0) return BreakableToken::Split(SlashOffset + 1, 0); + if (WordStartOffset != 0) + return BreakableToken::Split(WordStartOffset + 1, 0); if (SplitPoint != 0) return BreakableToken::Split(SplitPoint, 0); return BreakableToken::Split(StringRef::npos, 0); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 8454af32ed52..15a5d6b5746b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -4636,6 +4636,26 @@ TEST_F(FormatTest, BreakStringLiterals) { "\"slashes\"", format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); + EXPECT_EQ( + "\"split/\"\n" + "\"pathat/\"\n" + "\"slashes\"", + format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); + EXPECT_EQ("\"split at \"\n" + "\"spaces/at/\"\n" + "\"slashes.at.any$\"\n" + "\"non-alphanumeric%\"\n" + "\"1111111111characte\"\n" + "\"rs\"", + format("\"split at " + "spaces/at/" + "slashes.at." + "any$non-" + "alphanumeric%" + "1111111111characte" + "rs\"", + getLLVMStyleWithColumns(20))); + FormatStyle AlignLeft = getLLVMStyleWithColumns(12); AlignLeft.AlignEscapedNewlinesLeft = true; EXPECT_EQ(