r186515 - Improve line breaking before multi-line strings.
Daniel Jasper
djasper at google.com
Wed Jul 17 08:38:19 PDT 2013
Author: djasper
Date: Wed Jul 17 10:38:19 2013
New Revision: 186515
URL: http://llvm.org/viewvc/llvm-project?rev=186515&view=rev
Log:
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");
Modified:
cfe/trunk/lib/Format/Format.cpp
cfe/trunk/lib/Format/TokenAnnotator.cpp
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=186515&r1=186514&r2=186515&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Wed Jul 17 10:38:19 2013
@@ -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
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=186515&r1=186514&r2=186515&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Wed Jul 17 10:38:19 2013
@@ -963,18 +963,12 @@ void TokenAnnotator::calculateFormatting
} 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 +
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=186515&r1=186514&r2=186515&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Jul 17 10:38:19 2013
@@ -2981,27 +2981,34 @@ TEST_F(FormatTest, AlwaysBreakBeforeMult
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\";",
More information about the cfe-commits
mailing list