diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -211,10 +211,11 @@ const AnnotatedLine *TheLine = *I; if (TheLine->Last->is(TT_LineComment)) return 0; - if (I[1]->Type == LT_Invalid || I[1]->First->MustBreakBefore) + const auto &NextLine = *I[1]; + if (NextLine.Type == LT_Invalid || NextLine.First->MustBreakBefore) return 0; if (TheLine->InPPDirective && - (!I[1]->InPPDirective || I[1]->First->HasUnescapedNewline)) + (!NextLine.InPPDirective || NextLine.First->HasUnescapedNewline)) return 0; if (Style.ColumnLimit > 0 && Indent > Style.ColumnLimit) @@ -231,13 +232,13 @@ if (TheLine->Last->is(TT_FunctionLBrace) && TheLine->First == TheLine->Last && !Style.BraceWrapping.SplitEmptyFunction && - I[1]->First->is(tok::r_brace)) + NextLine.First->is(tok::r_brace)) return tryMergeSimpleBlock(I, E, Limit); // Handle empty record blocks where the brace has already been wrapped if (TheLine->Last->is(tok::l_brace) && TheLine->First == TheLine->Last && I != AnnotatedLines.begin()) { - bool EmptyBlock = I[1]->First->is(tok::r_brace); + bool EmptyBlock = NextLine.First->is(tok::r_brace); const FormatToken *Tok = I[-1]->First; if (Tok && Tok->is(tok::comment)) @@ -267,7 +268,7 @@ bool MergeShortFunctions = Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_All || (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty && - I[1]->First->is(tok::r_brace)) || + NextLine.First->is(tok::r_brace)) || (Style.AllowShortFunctionsOnASingleLine & FormatStyle::SFS_InlineOnly && TheLine->Level != 0); @@ -312,48 +313,49 @@ return MergeShortFunctions ? tryMergeSimpleBlock(I, E, Limit) : 0; } // Try to merge a control statement block with left brace unwrapped - if (TheLine->Last->is(tok::l_brace) && TheLine->First != TheLine->Last && + if (TheLine->Last->is(tok::l_brace) && TheLine->First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_for)) { return Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never ? tryMergeSimpleBlock(I, E, Limit) : 0; } // Try to merge a control statement block with left brace wrapped - if (I[1]->First->is(tok::l_brace) && - (TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, - tok::kw_for, tok::kw_switch, tok::kw_try, - tok::kw_do, TT_ForEachMacro) || - (TheLine->First->is(tok::r_brace) && TheLine->First->Next && - TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) && - Style.BraceWrapping.AfterControlStatement == - FormatStyle::BWACS_MultiLine) { - // If possible, merge the next line's wrapped left brace with the current - // line. Otherwise, leave it on the next line, as this is a multi-line - // control statement. - return (Style.ColumnLimit == 0 || - TheLine->Last->TotalLength <= Style.ColumnLimit) - ? 1 - : 0; - } else if (I[1]->First->is(tok::l_brace) && - TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, - tok::kw_for)) { - return (Style.BraceWrapping.AfterControlStatement == - FormatStyle::BWACS_Always) - ? tryMergeSimpleBlock(I, E, Limit) - : 0; - } else if (I[1]->First->is(tok::l_brace) && - TheLine->First->isOneOf(tok::kw_else, tok::kw_catch) && - Style.BraceWrapping.AfterControlStatement == - FormatStyle::BWACS_MultiLine) { - // This case if different from the upper BWACS_MultiLine processing - // in that a preceding r_brace is not on the same line as else/catch - // most likely because of BeforeElse/BeforeCatch set to true. - // If the line length doesn't fit ColumnLimit, leave l_brace on the - // next line to respect the BWACS_MultiLine. - return (Style.ColumnLimit == 0 || - TheLine->Last->TotalLength <= Style.ColumnLimit) - ? 1 - : 0; + if (NextLine.First->is(tok::l_brace)){ + if ((TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, + tok::kw_for, tok::kw_switch, tok::kw_try, + tok::kw_do, TT_ForEachMacro) || + (TheLine->First->is(tok::r_brace) && TheLine->First->Next && + TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) && + Style.BraceWrapping.AfterControlStatement == + FormatStyle::BWACS_MultiLine) { + // If possible, merge the next line's wrapped left brace with the + // current line. Otherwise, leave it on the next line, as this is a + // multi-line control statement. + return (Style.ColumnLimit == 0 || + TheLine->Last->TotalLength <= Style.ColumnLimit) + ? 1 + : 0; + } + if (TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while, + tok::kw_for)) { + return (Style.BraceWrapping.AfterControlStatement == + FormatStyle::BWACS_Always) + ? tryMergeSimpleBlock(I, E, Limit) + : 0; + } + if (TheLine->First->isOneOf(tok::kw_else, tok::kw_catch) && + Style.BraceWrapping.AfterControlStatement == + FormatStyle::BWACS_MultiLine) { + // This case if different from the upper BWACS_MultiLine processing + // in that a preceding r_brace is not on the same line as else/catch + // most likely because of BeforeElse/BeforeCatch set to true. + // If the line length doesn't fit ColumnLimit, leave l_brace on the + // next line to respect the BWACS_MultiLine. + return (Style.ColumnLimit == 0 || + TheLine->Last->TotalLength <= Style.ColumnLimit) + ? 1 + : 0; + } } // Don't merge block with left brace wrapped after ObjC special blocks if (TheLine->First->is(tok::l_brace) && I != AnnotatedLines.begin() && @@ -394,15 +396,15 @@ // Try to merge a block with left brace wrapped that wasn't yet covered if (TheLine->Last->is(tok::l_brace)) { return !Style.BraceWrapping.AfterFunction || - (I[1]->First->is(tok::r_brace) && + (NextLine.First->is(tok::r_brace) && !Style.BraceWrapping.SplitEmptyRecord) ? tryMergeSimpleBlock(I, E, Limit) : 0; } // Try to merge a function block with left brace wrapped - if (I[1]->First->is(TT_FunctionLBrace) && + if (NextLine.First->is(TT_FunctionLBrace) && Style.BraceWrapping.AfterFunction) { - if (I[1]->Last->is(TT_LineComment)) + if (NextLine.Last->is(TT_LineComment)) return 0; // Check for Limit <= 2 to account for the " {". @@ -413,7 +415,7 @@ unsigned MergedLines = 0; if (MergeShortFunctions || (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty && - I[1]->First == I[1]->Last && I + 2 != E && + NextLine.First == NextLine.Last && I + 2 != E && I[2]->First->is(tok::r_brace))) { MergedLines = tryMergeSimpleBlock(I + 1, E, Limit); // If we managed to merge the block, count the function header, which is