r221987 - clang-format: Support assignments as conditional operands.
Daniel Jasper
djasper at google.com
Fri Nov 14 05:03:40 PST 2014
Author: djasper
Date: Fri Nov 14 07:03:40 2014
New Revision: 221987
URL: http://llvm.org/viewvc/llvm-project?rev=221987&view=rev
Log:
clang-format: Support assignments as conditional operands.
Before:
return a != b
// comment
? a
: a = a != b
// comment
? a =
b : a;
After:
return a != b
// comment
? a
: a = a != b
// comment
? a = b
: a;
Modified:
cfe/trunk/lib/Format/TokenAnnotator.cpp
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=221987&r1=221986&r2=221987&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Fri Nov 14 07:03:40 2014
@@ -1120,7 +1120,9 @@ public:
// At the end of the line or when an operator with higher precedence is
// found, insert fake parenthesis and return.
if (!Current || (Current->closesScope() && Current->MatchingParen) ||
- (CurrentPrecedence != -1 && CurrentPrecedence < Precedence)) {
+ (CurrentPrecedence != -1 && CurrentPrecedence < Precedence) ||
+ (CurrentPrecedence == prec::Conditional &&
+ Precedence == prec::Assignment && Current->is(tok::colon))) {
if (LatestOperator) {
LatestOperator->LastOperator = true;
if (Precedence == PrecedenceArrowAndPeriod) {
@@ -1220,11 +1222,11 @@ private:
if (!Current || !Current->is(tok::question))
return;
next();
- parseConditionalExpr();
+ parse(prec::Assignment);
if (!Current || Current->Type != TT_ConditionalExpr)
return;
next();
- parseConditionalExpr();
+ parse(prec::Assignment);
addFakeParenthesis(Start, prec::Conditional);
}
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=221987&r1=221986&r2=221987&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Nov 14 07:03:40 2014
@@ -4132,6 +4132,26 @@ TEST_F(FormatTest, BreaksConditionalExpr
" ccccccccccccccccccccccccccccccccccccccc\n"
" ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
" : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
+
+ // Assignments in conditional expressions. Apparently not uncommon :-(.
+ verifyFormat("return a != b\n"
+ " // comment\n"
+ " ? a = b\n"
+ " : a = b;");
+ verifyFormat("return a != b\n"
+ " // comment\n"
+ " ? a = a != b\n"
+ " // comment\n"
+ " ? a = b\n"
+ " : a\n"
+ " : a;\n");
+ verifyFormat("return a != b\n"
+ " // comment\n"
+ " ? a\n"
+ " : a = a != b\n"
+ " // comment\n"
+ " ? a = b\n"
+ " : a;");
}
TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
More information about the cfe-commits
mailing list