From: Daniel Jasper Date: Wed, 17 Jul 2013 15:38:19 +0000 (+0000) Subject: Improve line breaking before multi-line strings. X-Git-Tag: llvmorg-3.4.0-rc1~8231 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c834c70986b01f5086d72bc5c5e564d7d0ebbc74;p=platform%2Fupstream%2Fllvm.git Improve line breaking before multi-line strings. The AlwaysBreakBeforeMultilineStrings rule does not really make sense if it does not a column gain. Before (in Google style): f( "aaaa" "bbbb"); After: f("aaaa" "bbbb"); llvm-svn: 186515 --- diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 125283a0c6dd..a4495ba62ee0 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1177,6 +1177,14 @@ private: !Current.isTrailingComment() && !Current.isOneOf(tok::r_paren, tok::r_brace)) return true; + if (Style.AlwaysBreakBeforeMultilineStrings && + State.Column > State.Stack.back().Indent && + Current.is(tok::string_literal) && Previous.isNot(tok::lessless) && + Previous.Type != TT_InlineASMColon && + ((Current.getNextNonComment() && + Current.getNextNonComment()->is(tok::string_literal)) || + (Current.TokenText.find("\\\n") != StringRef::npos))) + return true; // If we need to break somewhere inside the LHS of a binary expression, we // should also break after the operator. Otherwise, the formatting would diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 67a0fa892d50..021fd2488bbe 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -963,18 +963,12 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { } else if (Current->Previous->ClosesTemplateDeclaration && Style.AlwaysBreakTemplateDeclarations) { Current->MustBreakBefore = true; - } else if (Style.AlwaysBreakBeforeMultilineStrings && - Current->is(tok::string_literal) && - Current->Previous->isNot(tok::lessless) && - Current->Previous->Type != TT_InlineASMColon && - ((Current->getNextNonComment() && - Current->getNextNonComment()->is(tok::string_literal)) || - (Current->TokenText.find("\\\n") != StringRef::npos))) { - Current->MustBreakBefore = true; } Current->CanBreakBefore = Current->MustBreakBefore || canBreakBefore(Line, *Current); - if (Current->MustBreakBefore) + if (Current->MustBreakBefore || + (Current->is(tok::string_literal) && + Current->TokenText.find("\\\n") != StringRef::npos)) Current->TotalLength = Current->Previous->TotalLength + Style.ColumnLimit; else Current->TotalLength = Current->Previous->TotalLength + diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 3b8f91130ff4..353fcc7d0bda 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2981,27 +2981,34 @@ TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { NoBreak.AlwaysBreakBeforeMultilineStrings = false; FormatStyle Break = getLLVMStyle(); Break.AlwaysBreakBeforeMultilineStrings = true; - EXPECT_EQ("aaaa = \"bbbb\"\n" - " \"cccc\";", - format("aaaa=\"bbbb\" \"cccc\";", NoBreak)); - EXPECT_EQ("aaaa =\n" - " \"bbbb\"\n" - " \"cccc\";", - format("aaaa=\"bbbb\" \"cccc\";", Break)); - EXPECT_EQ("aaaa(\"bbbb\"\n" - " \"cccc\");", - format("aaaa(\"bbbb\" \"cccc\");", NoBreak)); - EXPECT_EQ("aaaa(\n" - " \"bbbb\"\n" - " \"cccc\");", - format("aaaa(\"bbbb\" \"cccc\");", Break)); - EXPECT_EQ("aaaa(qqq, \"bbbb\"\n" - " \"cccc\");", - format("aaaa(qqq, \"bbbb\" \"cccc\");", NoBreak)); - EXPECT_EQ("aaaa(qqq,\n" - " \"bbbb\"\n" - " \"cccc\");", - format("aaaa(qqq, \"bbbb\" \"cccc\");", Break)); + verifyFormat("aaaa = \"bbbb\"\n" + " \"cccc\";", + NoBreak); + verifyFormat("aaaa =\n" + " \"bbbb\"\n" + " \"cccc\";", + Break); + verifyFormat("aaaa(\"bbbb\"\n" + " \"cccc\");", + NoBreak); + verifyFormat("aaaa(\n" + " \"bbbb\"\n" + " \"cccc\");", + Break); + verifyFormat("aaaa(qqq, \"bbbb\"\n" + " \"cccc\");", + NoBreak); + verifyFormat("aaaa(qqq,\n" + " \"bbbb\"\n" + " \"cccc\");", + Break); + + // Don't break if there is no column gain. + verifyFormat("f(\"aaaa\"\n" + " \"bbbb\");", + Break); + + // Treat literals with escaped newlines like multi-line string literals. EXPECT_EQ("x = \"a\\\n" "b\\\n" "c\";",