r189102 - clang-format: Fix corner case for string splitting ..
Daniel Jasper
djasper at google.com
Fri Aug 23 04:57:34 PDT 2013
Author: djasper
Date: Fri Aug 23 06:57:34 2013
New Revision: 189102
URL: http://llvm.org/viewvc/llvm-project?rev=189102&view=rev
Log:
clang-format: Fix corner case for string splitting ..
.. in conjunction with Style.AlwaysBreakBeforeMultilineStrings. Also,
simplify the implementation by handling newly split strings and already
split strings by the same code.
Modified:
cfe/trunk/lib/Format/ContinuationIndenter.cpp
cfe/trunk/lib/Format/ContinuationIndenter.h
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=189102&r1=189101&r2=189102&view=diff
==============================================================================
--- cfe/trunk/lib/Format/ContinuationIndenter.cpp (original)
+++ cfe/trunk/lib/Format/ContinuationIndenter.cpp Fri Aug 23 06:57:34 2013
@@ -116,12 +116,9 @@ bool ContinuationIndenter::mustBreak(con
!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)))
+ State.Column > State.Stack.back().Indent && // Breaking saves columns.
+ Previous.isNot(tok::lessless) && Previous.Type != TT_InlineASMColon &&
+ NextIsMultilineString(State))
return true;
if (!Style.BreakBeforeBinaryOperators) {
@@ -547,13 +544,8 @@ unsigned ContinuationIndenter::moveState
}
State.Column += Current.CodePointCount;
-
State.NextToken = State.NextToken->Next;
-
- unsigned Penalty = 0;
- if (Newline || !Style.AlwaysBreakBeforeMultilineStrings ||
- Current.isNot(tok::string_literal) || !Current.CanBreakBefore)
- Penalty += breakProtrudingToken(Current, State, DryRun);
+ unsigned Penalty = breakProtrudingToken(Current, State, DryRun);
// If the previous has a special role, let it consume tokens as appropriate.
// It is necessary to start at the previous token for the only implemented
@@ -688,5 +680,19 @@ unsigned ContinuationIndenter::getColumn
return Style.ColumnLimit - (Line.InPPDirective ? 2 : 0);
}
+bool ContinuationIndenter::NextIsMultilineString(const LineState &State) {
+ const FormatToken &Current = *State.NextToken;
+ if (!Current.is(tok::string_literal))
+ return false;
+ if (Current.getNextNonComment() &&
+ Current.getNextNonComment()->is(tok::string_literal))
+ return true; // Implicit concatenation.
+ if (State.Column + Current.CodePointCount + Current.UnbreakableTailLength >
+ Style.ColumnLimit)
+ return true; // String will be split.
+ // String literal might have escaped newlines.
+ return Current.TokenText.find("\\\n") != StringRef::npos;
+}
+
} // namespace format
} // namespace clang
Modified: cfe/trunk/lib/Format/ContinuationIndenter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.h?rev=189102&r1=189101&r2=189102&view=diff
==============================================================================
--- cfe/trunk/lib/Format/ContinuationIndenter.h (original)
+++ cfe/trunk/lib/Format/ContinuationIndenter.h Fri Aug 23 06:57:34 2013
@@ -84,6 +84,13 @@ private:
unsigned breakProtrudingToken(const FormatToken &Current, LineState &State,
bool DryRun);
+ /// \brief Returns \c true if the next token starts a multiline string
+ /// literal.
+ ///
+ /// This includes implicitly concatenated strings, strings that will be broken
+ /// by clang-format and string literals with escaped newlines.
+ bool NextIsMultilineString(const LineState &State);
+
FormatStyle Style;
SourceManager &SourceMgr;
const AnnotatedLine &Line;
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=189102&r1=189101&r2=189102&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Aug 23 06:57:34 2013
@@ -5265,6 +5265,12 @@ TEST_F(FormatTest, BreakStringLiterals)
format("llvm::outs() << "
"\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaa\";"));
+ EXPECT_EQ("ffff(\n"
+ " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
+ format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
+ getGoogleStyle()));
FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
AlignLeft.AlignEscapedNewlinesLeft = true;
More information about the cfe-commits
mailing list