/// \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;
// 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;
}
}
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;
" : 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;