From 0fde9504af582459c93c43363db2680bcd726126 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 12 Jul 2013 11:37:05 +0000 Subject: [PATCH] clang-format: Fix string literal breaking. Before this patch, it did not cooperate with Style::AlwaysBreakBeforeMultilineStrings. Thus, it would turn aaaaaaaaaaaa(aaaaaaaaaaaaa, "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa"); into: aaaaaaaaaaaa(aaaaaaaaaaaaa, "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa " "aaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa"); and only a second format step would lead to the desired (with that option): aaaaaaaaaaaa(aaaaaaaaaaaaa, "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa " "aaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa"); This could even lead to clang-format breaking the string at a different character and thus leading to a completely different end result. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186154 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/Format.cpp | 10 +++++++--- unittests/Format/FormatTest.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index b1f9f4c85b..224f1d759f 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -297,7 +297,7 @@ public: State.IgnoreStackForComparison = false; // The first token has already been indented and thus consumed. - moveStateToNextToken(State, /*DryRun=*/false); + moveStateToNextToken(State, /*DryRun=*/false, /*Newline=*/false); // If everything fits on a single line, just put it there. unsigned ColumnLimit = Style.ColumnLimit; @@ -729,12 +729,12 @@ private: } } - return moveStateToNextToken(State, DryRun) + ExtraPenalty; + return moveStateToNextToken(State, DryRun, Newline) + ExtraPenalty; } /// \brief Mark the next token as consumed in \p State and modify its stacks /// accordingly. - unsigned moveStateToNextToken(LineState &State, bool DryRun) { + unsigned moveStateToNextToken(LineState &State, bool DryRun, bool Newline) { const FormatToken &Current = *State.NextToken; assert(State.Stack.size()); @@ -875,6 +875,10 @@ private: State.NextToken = State.NextToken->Next; + if (!Newline && Style.AlwaysBreakBeforeMultilineStrings && + Current.is(tok::string_literal)) + return 0; + return breakProtrudingToken(Current, State, DryRun); } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 50f033ccab..4ca5bb49b6 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -4958,6 +4958,16 @@ TEST_F(FormatTest, BreakStringLiterals) { "rs\"", getLLVMStyleWithColumns(20))); + // Verify that splitting the strings understands + // Style::AlwaysBreakBeforeMultilineStrings. + EXPECT_EQ("aaaaaaaaaaaa(aaaaaaaaaaaaa,\n" + " \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" + " \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", + format("aaaaaaaaaaaa(aaaaaaaaaaaaa, \"aaaaaaaaaaaaaaaaaaaaaa " + "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa " + "aaaaaaaaaaaaaaaaaaaaaa\");", + getGoogleStyle())); + FormatStyle AlignLeft = getLLVMStyleWithColumns(12); AlignLeft.AlignEscapedNewlinesLeft = true; EXPECT_EQ( -- 2.40.0