r183007 - Properly format nested conditional operators.
Daniel Jasper
djasper at google.com
Fri May 31 07:56:13 PDT 2013
Author: djasper
Date: Fri May 31 09:56:12 2013
New Revision: 183007
URL: http://llvm.org/viewvc/llvm-project?rev=183007&view=rev
Log:
Properly format nested conditional operators.
Before:
bool aaaaaa = aaaaaaaaaaaaa //
? aaaaaaaaaaaaaaa
: bbbbbbbbbbbbbbb //
? ccccccccccccccc
: ddddddddddddddd;
After:
bool aaaaaa = aaaaaaaaaaaaa //
? aaaaaaaaaaaaaaa
: bbbbbbbbbbbbbbb //
? ccccccccccccccc
: ddddddddddddddd;
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=183007&r1=183006&r2=183007&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Fri May 31 09:56:12 2013
@@ -757,6 +757,11 @@ public:
/// \brief Parse expressions with the given operatore precedence.
void parse(int Precedence = 0) {
+ // Conditional expressions need to be parsed separately for proper nesting.
+ if (Precedence == prec::Conditional + 1) {
+ parseConditionalExpr();
+ return;
+ }
if (Precedence > prec::PointerToMember || Current == NULL)
return;
@@ -786,11 +791,8 @@ public:
// found, insert fake parenthesis and return.
if (Current == NULL || Current->closesScope() ||
(CurrentPrecedence != 0 && CurrentPrecedence < Precedence)) {
- if (OperatorFound) {
- Start->FakeLParens.push_back(prec::Level(Precedence - 1));
- if (Current)
- ++Current->Previous->FakeRParens;
- }
+ if (OperatorFound)
+ addFakeParenthesis(Start, prec::Level(Precedence - 1));
return;
}
@@ -812,6 +814,26 @@ public:
}
private:
+ void addFakeParenthesis(FormatToken *Start, prec::Level Precedence) {
+ Start->FakeLParens.push_back(Precedence);
+ if (Current)
+ ++Current->Previous->FakeRParens;
+ }
+
+ void parseConditionalExpr() {
+ FormatToken *Start = Current;
+ parse(prec::LogicalOr + 1);
+ if (!Current || !Current->is(tok::question))
+ return;
+ next();
+ parse(prec::LogicalOr + 1);
+ if (!Current || Current->Type != TT_ConditionalExpr)
+ return;
+ next();
+ parseConditionalExpr();
+ addFakeParenthesis(Start, prec::Conditional);
+ }
+
void next() {
if (Current != NULL)
Current = Current->Next;
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=183007&r1=183006&r2=183007&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Fri May 31 09:56:12 2013
@@ -2551,6 +2551,16 @@ TEST_F(FormatTest, BreaksConditionalExpr
" : TheLine * 2,\n"
" TheLine.InPPDirective, PreviousEndOfLineColumn);",
getLLVMStyleWithColumns(70));
+ verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
+ " ? aaaaaaaaaaaaaaa\n"
+ " : bbbbbbbbbbbbbbb //\n"
+ " ? ccccccccccccccc\n"
+ " : ddddddddddddddd;");
+ verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
+ " ? aaaaaaaaaaaaaaa\n"
+ " : (bbbbbbbbbbbbbbb //\n"
+ " ? ccccccccccccccc\n"
+ " : ddddddddddddddd);");
FormatStyle NoBinPacking = getLLVMStyle();
NoBinPacking.BinPackParameters = false;
More information about the cfe-commits
mailing list